Hallo Leute,
da ich nun hier auch einiges gelernt habe was die Server Konfiguration etc. betrifft würde ich gern noch meine Erkenntnisse mit euch teilen.
Eventuell greife ich Sachen auf die hier schon erwähnt wurden und werde dann natürlich die entsprechenden Beiträge auch verlinken.
1.) Start Spawn Gear, Tageszeit & Wetter
Wie ihr vielleicht schon wisst muss dies in der 'init.c' festgelegt werden, anbei meine kommentierte 'init.c'
Diese findet ihr unter '\ServerRootDir\mpmissions\dayzOffline.chernarusplus\init.c'
void main()
{
//INIT WEATHER BEFORE ECONOMY INIT------------------------
//If all is set to null give always sunshine, no fog, and less clouds
Weather weather = g_Game.GetWeather();
weather.GetOvercast().SetLimits( 0.0 , 0.0 );
weather.GetRain().SetLimits( 0.0 , 0.0 );
weather.GetFog().SetLimits( 0.0 , 0.0 );
weather.GetOvercast().SetForecastChangeLimits( 0.0, 0.0 );
weather.GetRain().SetForecastChangeLimits( 0.0, 0.0 );
weather.GetFog().SetForecastChangeLimits( 0.0, 0.0 );
weather.GetOvercast().Set( 0, 0, 0);
weather.GetRain().Set( 0, 0, 0);
weather.GetFog().Set( 0, 0, 0);
weather.SetWindMaximumSpeed(0);
weather.SetWindFunctionParams(0.0, 0.0, 0);
//INIT ECONOMY--------------------------------------
Hive ce = CreateHive();
if ( ce )
ce.InitOffline();
GetGame().GetWorld().SetDate(2018, 8, 10, 13, 00); //Set the ingame date and time
}
class CustomMission: MissionServer
{
void SetRandomHealth(EntityAI itemEnt)
{
if ( itemEnt )
{
int rndHlt = Math.RandomInt(55,100);
itemEnt.SetHealth("","",rndHlt);
}
}
//This func can be used or not, it is your choice
void addMags(PlayerBase player, string mag_type, int count)
{
EntityAI mag;
if (count < 1) return;
for (int i = 0; i < count; i++)
{
mag = player.GetInventory().CreateInInventory(mag_type);
}
}
override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)
{
Entity playerEnt;
playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player
Class.CastTo(m_player, playerEnt);
GetGame().SelectPlayer(identity, m_player);
return m_player;
}
override void StartingEquipSetup(PlayerBase player, bool clothesChosen)
{
EntityAI itemEnt;
ItemBase itemBs;
//Entitys
EntityAI gun_m4a1;
EntityAI gun_fnx45;
EntityAI cloth_gorkaHelmet;
EntityAI cloth_militaryBoots;
//Get & Save Admin UIDs
const string admin_uid = "xxxxxxxxxxxxxxx";
const string admin_uid2 = "xxxxxxxxxxxxxxx";
string player_uid = player.GetIdentity().GetPlainId();
//RemoveAllItems
player.RemoveAllItems();
//Check if admin or not and choose spawn type
if(player_uid == admin_uid || player_uid == admin_uid2)
{
// ADMIN SPAWN
//Backpack
ItemBase.Cast(player.GetInventory().CreateInInventory("HuntingBag"));
//Clothing
cloth_gorkaHelmet = player.GetInventory().CreateInInventory("GorkaHelmet");
//cloth_gorkaHelmet.GetInventory().CreateAttachment("GorkaHelmetVisor"); //not working, don't know why
cloth_militaryBoots = player.GetInventory().CreateInInventory("MilitaryBoots_Black");
cloth_militaryBoots.GetInventory().CreateAttachment("CombatKnife"); //attach the knife to the boots
ItemBase.Cast(player.GetInventory().CreateInInventory("BalaclavaMask_Blackskull"));
ItemBase.Cast(player.GetInventory().CreateInInventory("TacticalGloves_Black"));
ItemBase.Cast(player.GetInventory().CreateInInventory("TTsKOJacket_Camo"));
ItemBase.Cast(player.GetInventory().CreateInInventory("TTSKOPants"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Armband_White"));
//Primary Weapon
gun_m4a1 = player.GetHumanInventory().CreateInHands("M4A1"); //if not working you can try .GetEntityInHands()
//attach the following attachments to the gun
gun_m4a1.GetInventory().CreateAttachment("ACOGOptic");
gun_m4a1.GetInventory().CreateAttachment("M4_Suppressor");
gun_m4a1.GetInventory().CreateAttachment("M4_RISHndgrd_Black");
gun_m4a1.GetInventory().CreateAttachment("M4_OEBttstck_Black");
gun_m4a1.GetInventory().CreateAttachment("Light_Universal");
//gun_m4a1.GetInventory().CreateAttachment("Mag_STANAG_30Rnd"); BUGGY DONT USE
//addMags(player, "Mag_STANAG_30Rnd", 2); //addMags(player, "Mag_STANAGCoupled_30Rnd", 2);
// Secondary Weapon
gun_fnx45 = player.GetInventory().CreateInInventory("FNX45");
gun_fnx45.GetInventory().CreateAttachment("PistolSuppressor");
//gun_fnx45.GetInventory().CreateAttachment("Mag_FNX45_15Rnd"); BUGGY DONT USE
//Ammunition
ItemBase.Cast(player.GetInventory().CreateInInventory("Mag_STANAG_30Rnd"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Mag_STANAG_30Rnd"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Mag_STANAG_30Rnd"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"));
//Food
ItemBase.Cast(player.GetInventory().CreateInInventory("SodaCan_Pipsi"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SodaCan_Pipsi"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SodaCan_Pipsi"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SpaghettiCan"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SpaghettiCan"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SpaghettiCan"));
// Medical Supplies
ItemBase.Cast(player.GetInventory().CreateInInventory("Morphine"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Rag")).SetQuantity(6);
// Utilities
ItemBase.Cast(player.GetInventory().CreateInInventory("CanOpener"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Battery9V"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Battery9V"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Battery9V"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SparkPlug"));
ItemBase.Cast(player.GetInventory().CreateInInventory("TetracyclineAntibiotics"));
//CreateQuickbar Shortcuts, 0 is the 1st place, 1 the 2nd etc.
player.SetQuickBarEntityShortcut(gun_m4a1, 0, true); //you can use without true, true is for forcing player.SetQuickBarEntityShortcut(gun_m4a1, 0);
player.SetQuickBarEntityShortcut(gun_fnx45, 1, true);
}
else
{
// DEFAULT SPAWN
//Backpack
ItemBase.Cast(player.GetInventory().CreateInInventory("HuntingBag"));
//Clothing
ItemBase.Cast(player.GetInventory().CreateInInventory("WorkingGloves_Beige"));
ItemBase.Cast(player.GetInventory().CreateInInventory("CargoPants_Beige"));
ItemBase.Cast(player.GetInventory().CreateInInventory("TacticalShirt_Tan"));
ItemBase.Cast(player.GetInventory().CreateInInventory("PlateCarrierComplete"));
ItemBase.Cast(player.GetInventory().CreateInInventory("HikingBootsLow_Beige"));
ItemBase.Cast(player.GetInventory().CreateInInventory("MilitaryBeretChDKZ"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Armband_Red"));
//Primary Weapon
gun_fnx45 = player.GetHumanInventory().CreateInHands("FNX45");
gun_fnx45.GetInventory().CreateAttachment("PistolSuppressor");
//Ammunition
ItemBase.Cast(player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"));
//Food
ItemBase.Cast(player.GetInventory().CreateInInventory("SodaCan_Pipsi"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SodaCan_Pipsi"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SodaCan_Pipsi"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SpaghettiCan"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SpaghettiCan"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SpaghettiCan"));
// Medical Supplies
ItemBase.Cast(player.GetInventory().CreateInInventory("Morphine"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Rag")).SetQuantity(6);
// Utilities
ItemBase.Cast(player.GetInventory().CreateInInventory("CanOpener"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Flashlight"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Battery9V"));
ItemBase.Cast(player.GetInventory().CreateInInventory("Battery9V"));
ItemBase.Cast(player.GetInventory().CreateInInventory("SparkPlug"));
ItemBase.Cast(player.GetInventory().CreateInInventory("TetracyclineAntibiotics"));
//CreateQuickbar Shortcuts
player.SetQuickBarEntityShortcut(gun_fnx45, 0, true);
}
}
};
Mission CreateCustomMission(string path)
{
return new CustomMission();
}
Alles anzeigen
Zum Thema Coding:
- Für die die sich nicht mit Coding auskennen eine kleine Erklärung.
- Kommentiert wird in C mit //comment für ein Zeilenkommentar und mit /*comment*/ ein zeilenübergreifendes Kommentar. Kommentare überspringt der Compiler und Code in Kommentaren wird nicht ausgeführt.
- Eine Funktion ist immer so aufgebaut: Rückgabetyp Funktionsname( Parameter1, Parameter2, ... ){ Code }
- Eine Funktion wie zum Beispiel oben override void StartingEquipSetup(PlayerBase player, bool clothesChosen) muss immer eine { besitzen und am Ende eine }.
- Eine Funktion hat immer einen oder keinen Rückgabetyp. Wenn eine Funktion keinen Rückgabetyp bestitzt, wird sie mit void initialisert, siehe Zeile 43. Ein Rückgabetyp wäre z.B. in Zeile 55 PlayerBase, deshalb wird auch in Zeile 63 return m_player zurückgegeben.
- Override besagt, dass es bereits irgendwo eine Funktion mit demselben Namen gibt und diese dann mit override überschrieben wird.
- Intern in einer Funktion wird jede Zeile mit einem Semikolon abgeschlossen damit der Compiler weiß das die Codezeile hier endet.
Ausnahmen sind z.B. if oder if else Anweisungen, z.B. Zeile 47. Dasselbe gilt für Schleifen (while, for, ...), siehe Zeile 49-52. - Aufrufe wie player.RemoveAllItems(); sind nichts anderes als ein Funktionsaufruf. Hier wird die Funktion RemoveAllItems() auf den Datentyp PlayerBase mit Namen player angewendet.
- Eine Klasse wie z.B. oben class CustomMission: MissionServer muss ebenfalls eine { und eine } besitzen, jedoch am Ende der Klasse ein Semikolon, siehe Zeile 202.
Zudem ist es seit 1.0 möglich die Tageszeit auch per Config Datei einzustellen.
ZitatAlles anzeigenserverTime="2015/06/21/06/00";
// Server Start Time // Initial ingame time of server. "SystemTime" means local time of machine. Another possibility is to set the time to some value in "YYYY/MM/DD/HH/MM" format, f.e. "2015/4/8/17/23" .
serverTimeAcceleration=2;
// Accelerated Time (value 0-24) // This is a time multiplier for in-game time. In this case time would move 24 times faster than normal, an entire day would pass in one hour.
serverTimePersistent=0;
// Persistent Time (value 0-1) // Actual server time is saved to storage, so when active, next server start will use saved time value.
2.) no Stamina einstellen
- Benötigte Tools: PBO Manager
- Navigiert dazu in euer Server Root Directory '\ServerRootDir\dta\scripts.pbo' und kopiert die scripts.pbo in einen anderen Ordner, und entpackt die pbo Datei mit Rechtsklick -> PBO Manager -> extract to \scripts.pbo
- Navigiert in scripts.pbo zu '\scripts\3_Game\constants.c' und öffnet diese mit Notepad++
- Anbei ein Ausschnitt aus meiner 'constants.c'
const int STAMINA_DRAIN_STANDING_SPRINT_PER_SEC = 0; //in units (how much sprint depletes stamina)
const int STAMINA_DRAIN_CROUCHED_SPRINT_PER_SEC = 0; //in units (how much sprint in crouch depletes stamina)
const int STAMINA_DRAIN_PRONE_SPRINT_PER_SEC = 0; //in units (how much sprint in prone depletes stamina)
const int STAMINA_DRAIN_SWIM_FAST_PER_SEC = 0; //in units (how much fast swimming depletes stamina)
const int STAMINA_DRAIN_LADDER_FAST_PER_SEC = 0; //in units (how much fast ladder climb depletes stamina)
const float STAMINA_DRAIN_HOLD_BREATH = 0; //in units (how much holding breath depletes stamina)
const float STAMINA_DRAIN_JUMP = 0; // in units (how much jumping depletes stamina)
const float STAMINA_DRAIN_MELEE_LIGHT = 0; //in units (how much light melee punch depletes stamina)
const float STAMINA_DRAIN_MELEE_HEAVY = 0; //in units (how much heavy melee punch depletes stamina)
const float STAMINA_DRAIN_MELEE_EVADE = 0; // in units (how much evade depletes stamina)
const int STAMINA_GAIN_JOG_PER_SEC = 100; //in units (how much of stamina units is gained while jogging)
const int STAMINA_GAIN_WALK_PER_SEC = 100; //in units (how much of stamina units is gained while walking)
const int STAMINA_GAIN_IDLE_PER_SEC = 100; //in units (how much of stamina units is gained while iddling)
const int STAMINA_GAIN_SWIM_PER_SEC = 100; //in units (how much of stamina units is gained while slowly swim)
const int STAMINA_GAIN_LADDER_PER_SEC = 100; //in units (how much of stamina units is gained while slowly swim)
const float STAMINA_GAIN_BONUS_CAP = 100; //in units (tells how much extra units can be added at best to stamina regain)
const float STAMINA_KG_TO_STAMINAPERCENT_PENALTY = 0; //in units (by how many units is max stamina bar reduced for each 1 kg of load weight)
const float STAMINA_MIN_CAP = 0; //in units (overload won't reduce max stamina bar under this value)
const float STAMINA_SPRINT_THRESHOLD = 0; //in units (how many units of stamina you need regained in order to be able to start sprinting)
const float STAMINA_HOLD_BREATH_THRESHOLD = 0; // in units
const float STAMINA_JUMP_THRESHOLD = 0; // in units
const float STAMINA_MELEE_HEAVY_THRESHOLD = 0; // in units (how many units we need to make a heavy hit in melee)
const float STAMINA_MELEE_EVADE_THRESHOLD = 0; // in units
const float STAMINA_REGEN_COOLDOWN_DEPLETION = 0; // in secs (how much time we will spend in cooldown before the stamina will starts with regeneration)
const float STAMINA_REGEN_COOLDOWN_EXHAUSTION = 0;
const float STAMINA_WEIGHT_LIMIT_THRESHOLD = 500000; //! in grams (weight where the player is not penalized by stamina)
const float STAMINA_KG_TO_GRAMS = 1000; //for kg to g conversion
const float STAMINA_SYNC_RATE = 1; //in secs
const float STAMINA_MAX = 10000;
Alles anzeigen
Wenn ihr diese Zeilen so übernehmt wird euer Stamina immer wieder sofort auf Maximum gepusht.
3.) Player Spawn Points festlegen
- WICHTIG Server vorher runterfahren und alle DayZ Prozesse beenden!
- Navigiert in '\DayZServer\mpmissions\dayzOffline.chernarusplus\storage_1' und löscht die Datei spawnpoints.bin (Sicherheitskopie!)
- Navigiert in '\ServerRootDir\mpmissions\dayzOffline.chernarusplus\'
- Öffnet 'cfgplayerspawnpoints.xml' mit Notepad++ und editiert die Spawn Points bei <generator_posbubbles>
- Nehmt am besten https://dayz.ginfo.gg/ für die Koordinaten