Moin zusammen,
ich habe in den letzten Tagen angefangen mich in SQF einzulesen und mein erstes Script für einen Altis Life Server geschrieben.
Erfahrungen in Sachen Programmieren habe ich in der Sprache Basic gesammelt und konnte dort auch ein etwa 1.500 Zeilen Programm erfolgreich abschließen.
Nun aber zum eigentlichen Programm:
#include "..\..\script_macros.hpp"
/*
File: Waffenlieferung.sqf
Author: SanDiego
Description:
Random Waffenlieferung.
*/
private ["_reloadtime", "_preis"];
_chuteType = "I_Parachute_02_F"; //Art des Fallschirms
_crateType = "Box_IND_AmmoVeh_F"; //Art der Kiste
_lightType = "Chemlight_red"; //Farbe des Lichtes
_smokeType = "SmokeShellPurple"; //Farbe des Rausch
_preis = 1000000; //Preis für eine Waffenlieferung
_reloadtime = 120; //Abklingzeit
_vorsprung = 40; //Zeit bis es bei allen angezeigt wird
_reloadtime = _reloadtime - _vorsprung;
_Waffenanzahl = 5; //Anzahl der Waffen in einer Kiste
_caller = _this select 1;
//Waffen und ihre Munitionsarten
_waffe1 = ["srifle_DMR_02_camo_F","10Rnd_338_Mag"];
_waffe2 = ["srifle_DMR_03_woodland_F","20Rnd_762x51_Mag"];
_waffe3 = ["srifle_DMR_06_camo_F","20Rnd_762x51_Mag"];
_waffe4 = ["LMG_Zafir_F","150Rnd_762x54_Box"];
_waffe5 = ["srifle_EBR_F","20Rnd_762x51_Mag"];
_waffe6 = ["launch_RPG7_F","RPG7_F"];
_waffe7 = ["lmg_03_F","200Rnd_556x45_Box_F"];
_waffe8 = ["srifle_DMR_07_ghex_F","20Rnd_650x39_Cased_Mag_F"];
//Marker, an denen Kiste gespawnt werden kann
_position1 = getMarkerPos "airdrop_1";
_position2 = getMarkerPos "airdrop_2";
_position3 = getMarkerPos "airdrop_3";
_position4 = getMarkerPos "airdrop_4";
_position5 = getMarkerPos "airdrop_5";
_position6 = getMarkerPos "airdrop_6";
//Abfrage, ob schon bestellt und welcher Gruppe der Spieler, der das Script aufruft, angehört und ob Spieler genug Geld hat
if ( !(isNil "bestellt")) exitWith {hint "Mein Lager ist derzeit leer. Komm doch später noch einmal wieder."};
if ( !(side _caller == civilian)) exitWith {hint "Mit euch rede ich nicht!"};
if (_preis > CASH ) exitWith {hint "Bring erst einmal etwas Kohle her. Dann können wir weiterreden." };
CASH = CASH - _preis;
bestellt = false;
publicVariable "bestellt";
hint "Die Waffenlieferung ist unterwegs. Ich habe es mal auf deiner Karte eingezeichnet.";
_waffen = [_waffe1, _waffe2, _waffe3, _waffe4, _waffe5, _waffe6, _waffe7, _waffe8];
_positionen = [_position1, _position2, _position3, _position4, _position5, _position6];
_rndPos = _positionen select (floor(random (count _positionen)));
_chute = createVehicle [_chuteType, _rndPos, [], 0, 'FLY'];
_crate = createVehicle [_crateType, _rndPos, [], 0, 'NONE'];
_crate attachTo [_chute, [0, 0, -0.55]];
_crate allowDamage false;
_light = createVehicle [_lightType, position _chute, [], 0, 'NONE'];
_light attachTo [_crate, [0, 0, 0.1]];
_light2 = createVehicle [_lightType, position _chute, [], 0, 'NONE'];
_light2 attachTo [_crate, [0, 0, -0.2]];
//Kiste leer machen
clearWeaponCargoGlobal _crate;
clearMagazineCargoGlobal _crate;
clearItemCargoGlobal _crate;
//Kiste beladen mit Zufallswaffen
for "_i" from 1 to _waffenanzahl do
{
_rndWep = _waffen select (floor(random (count _waffen)));
_crate addWeaponCargoGlobal [(_rndWep select 0), 1];
_crate addMagazineCargoGlobal [(_rndWep select 1), 10];
};
//Lokalen Marker auf der Map erstellen
_crateMarkerLoc = createMarkerLocal ["Kistendrop_local", _crate];
_crateMarkerLoc setMarkerShapeLocal "ELLIPSE";
_crateMarkerLoc setMarkerSizeLocal [500, 500];
_crateMarkerLoc setMarkerColorLocal "ColorRed";
_crateMarkerLoc setMarkerBrushLocal "FDiagonal";
_crateMarkerTextLoc = createMarkerLocal ["KistendropText_local", _crate];
_crateMarkerTextLoc setMarkerTypeLocal "hd_dot";
_crateMarkerTextLoc setMarkerColorLocal "Default";
_crateMarkerTextLoc setMarkerTextLocal "Waffenlieferung!";
//Warten bis die Kiste den Boden erreicht hat
waitUntil {position _crate select 2 < 1 || isNull _chute};
detach _crate;
_crate setPos [position _crate select 0, position _crate select 1, 0];
_smoke1 = _smokeType createVehicle [getPos _crate select 0, getPos _crate select 1,5];
//Marker für alle machen, alten Marker löschen etc.
sleep _vorsprung;
hint "Die Mapmarkierung ist jetzt für alle sichtbar!";
systemchat "Chen hat wieder eine seiner berühmten Waffenlieferungen losgeschickt!";
deleteMarkerLocal "Kistendrop_local";
deleteMarkerLocal "KistendropText_local";
_crateMarker = createMarker ["Kistendrop", _crate];
_crateMarker setMarkerShape "ELLIPSE";
_crateMarker setMarkerSize [500,500];
_crateMarker setMarkerColor "ColorRed";
_crateMarker setMarkerBrush "FDiagonal";
_crateMarker setMarkerText "Waffenlieferung! Sperrzone!";
_crateMarkerText = createMarker["KistendropText", _crate];
_crateMarkerText setMarkerType "hd_dot";
_crateMarkerText setMarkerColor "Default";
_crateMarkerText setMarkerText "Waffenlieferung! Sperrzone!";
_smoke2 = _smokeType createVehicle [getPos _crate select 0, getPos _crate select 1,5];
sleep _reloadtime;
systemchat ("Die Kiste wurde zerstört! Eine neue Waffenlieferung ist bereits in Chens Lager eingetroffen!");
deleteMarker _crateMarker;
deleteMarker "KistendropText";
deleteVehicle _crate;
deleteVehicle _light;
deleteVehicle _light2;
bestellt = nil;
publicVariable "bestellt";
Alles anzeigen
Die Init im NPC lautet:
this addAction["<t color=""#F21B3F"">" +"Waffenlieferung ( 1.000.000 € )","custom\Waffenlieferung.sqf",nil,0,false,true,"","",4];
Was macht das Script eigentlich?
Nunja. Wenn man 1.000.000 Euro auf der Hand hat, dann droppt zufällig bei einer von 6 Positionen eine Waffenkiste mit 5 zufälligen Waffen und jeweils 10 Magazinen. Die Kiste hängt an einem Fallschirm, leuchtet dank Knicklicht und es werden 2 Rauchgranaten zur besseren Sichtbarkeit erzeugt. Nach einer gewissen Zeit wird die Kiste zerstört und es ist eine neue bei dem NPC verfügbar. In der Zwischenzeit kann man keine neue Kiste anfordern.
Jetzt zu meinen eigentlichen Fragen:
1. Kann man so Sachen für Altis Life scripten? Oder macht es besser anders?
2. Kann man das ganze noch ressourcensparender realisieren? Also so, dass es möglichst wenig Leistung vom Server frisst.
3. Gibt es allgemeine Dinge, die man eher vermeiden sollte?
Grüße SanDiego