1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Downloads
  4. Galerie
    1. Alben
  5. Toolbox
    1. Passwort Generator
    2. Portchecker
  6. Mitglieder
    1. Mitgliedersuche
    2. Benutzer online
    3. Trophäen
    4. Team
Fr: 23 Mai 2025
  • Anmelden oder registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Forum
  • Dateien
  • Seiten
  • Bilder
  • Erweiterte Suche

Schön, dass du den Weg zu NodeZone.net gefunden hast! Aktuell bist du nicht angemeldet und kannst deshalb nur eingeschränkt auf unsere Community zugreifen. Um alle Funktionen freizuschalten, spannende Inhalte zu entdecken und dich aktiv einzubringen, registriere dich jetzt kostenlos oder melde dich mit deinem Account an.

Anmelden oder registrieren
    1. Nodezone.net Community
    2. Forum
    3. Gameserver & Hosting
    4. ArmA Series - ArmA 3 / Reforger
    5. Hilfeforum

    Verbesserungsvorschläge bzw. Kritik bei einem meiner ersten Scripts

    • SanDiego
    • 1. August 2016 um 16:27
    • Geschlossen
    • Erledigt
    • SanDiego
      Amateur
      Reaktionen
      50
      Trophäen
      9
      Beiträge
      187
      • 1. August 2016 um 16:27
      • #1

      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:

      CSS: Waffenlieferung.sqf
      #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:

      CSS
      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

    • blackfisch
      Legende
      Reaktionen
      2.944
      Trophäen
      9
      Beiträge
      5.966
      Dateien
      6
      Bilder
      63
      • 1. August 2016 um 16:40
      • #2

      Sieht an sich ganz interessant aus, erinnert mich persönlich recht stark an das Airdrop-Script von RyanTT, aber nette Geschichte. Was mir jetzt so auf den ersten Blick auffällt ist, dass die ganze Geschichte clientseitig abläuft. Es wäre schonender für den User und beugt BattlEye Restrictions und unnötigem whitelisten derer vor, wenn du die ganze Sache mit dem Spawnen und Beladen der Kiste serverseitig machen würdest. Der Client macht quasi nur die Abfragen mit Geld, Playerside usw., callt danach die serverseitige Funktion und den Marker kann man ja trotzdem local erstellen.
      Außerdem würde ich die Kiste nicht fest an einem Punkt fixieren sondern auf die einzelnen X & Y Koordinaten nochmal eine Zufallszahl aufaddieren, einfach aus Prinzip ^^

      Sonst aber ne sehr schöne Sache, kann man machen

      #MakeArmaNotWar

      Kein Support via PN & Steam! / No Support via DM & Steam!


      Mit freundlichen Grüßen
      blackfisch
      ______________________

      Web: blackfisch.me

      GitHub: GitHub.com/blackfisch

      Mail: [email protected]

      ______________________
      Wichtige Links:
      [Erklärung|Leitfaden] Code Optimierung

      [Tutorial] life_fnc_MP zu remoteExec

      Ohne Logs & entsprechende Dateien kein Support!

      ______________________

    • blackfisch
      Legende
      Reaktionen
      2.944
      Trophäen
      9
      Beiträge
      5.966
      Dateien
      6
      Bilder
      63
      • 1. August 2016 um 16:43
      • #3
      Zitat von SanDiego

      //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." };

      Ist mir gerade noch aufgefallen: Das sollte ganz nach oben ran! Ist einfach Ressourcenschonender. Zusätzlich würde ich noch folgendes dazu anhängen:

      C
      if (!isNull objectParent player) exitWith { hint "Steig erst einmal auf deinem Auto aus..." };
      if (!alive player) exitWith {}; //Dafuq? Der is ja tot!

      #MakeArmaNotWar

      Kein Support via PN & Steam! / No Support via DM & Steam!


      Mit freundlichen Grüßen
      blackfisch
      ______________________

      Web: blackfisch.me

      GitHub: GitHub.com/blackfisch

      Mail: [email protected]

      ______________________
      Wichtige Links:
      [Erklärung|Leitfaden] Code Optimierung

      [Tutorial] life_fnc_MP zu remoteExec

      Ohne Logs & entsprechende Dateien kein Support!

      ______________________

    • SanDiego
      Amateur
      Reaktionen
      50
      Trophäen
      9
      Beiträge
      187
      • 1. August 2016 um 17:17
      • #4

      Vielen Dank schon einmal für das Feedback!

      Den Tipp, die Abbruchbedingungen an den Anfang zu stellen und die anderen zu ergänzen, klingt logisch und habe ich auch sofort geändert! :D

      Zu der serverseitigen Funktion hätte ich noch ein paar Fragen und zwar:

      Erstelle ich den lokalen Marker dann in dem Script oder in der serverseitigen Funktion? Weil wenn ich das ja dann in der serverseitigen Funktion mache, muss ich dem Server ja irgendwie sagen, wo er das jetzt lokal erzeugen soll. Kann es dann dabei zu Synchronisationsprobleme kommen?
      Soll man bei der serverseitigen Funktion eher auf die Ordnerstrukturen von den anderen AltisFunktionen zurückgreifen oder geht es genauso gut, wenn ich mir einfach einen ordner mit customFunctions erstelle und da dann die Funktionen reinpacke?

      Die zufälligen X & Y - Koordinaten kommen bei mir durch den Wind zustande :D Aber, wenn der Rest läuft, dann baue ich an dieser Stelle sicherlich auch noch einmal etwas ein.

    • blackfisch
      Legende
      Reaktionen
      2.944
      Trophäen
      9
      Beiträge
      5.966
      Dateien
      6
      Bilder
      63
      • 1. August 2016 um 17:42
      • #5

      Die Marker machst du weiterhin lokal. Nur die Sachen die die Kiste betreffen machst du Serverseitig

      #MakeArmaNotWar

      Kein Support via PN & Steam! / No Support via DM & Steam!


      Mit freundlichen Grüßen
      blackfisch
      ______________________

      Web: blackfisch.me

      GitHub: GitHub.com/blackfisch

      Mail: [email protected]

      ______________________
      Wichtige Links:
      [Erklärung|Leitfaden] Code Optimierung

      [Tutorial] life_fnc_MP zu remoteExec

      Ohne Logs & entsprechende Dateien kein Support!

      ______________________

    Registrieren oder Einloggen

    Du bist noch kein Mitglied von NodeZone.net? Registriere dich kostenlos und werde Teil einer großartigen Community!

    Registrieren

    Wichtige Links & Informationen

    Server & Hosting-Ressourcen

      Server Administration & Hosting Basics

      Windows Server Support & Guides

      Linux Server Configuration & Help

      Setting up TeamSpeak 3 & VoIP Servers

      Domains & Web Hosting for Beginners & Professionals

      Cloud Hosting, Docker & Kubernetes Tutorials

    Gameserver & Modding-Ressourcen

      ArmA 3 Tutorials & Script Collection

      Renting & Operating Gameservers

      DayZ Server Management & Help

      FiveM (GTA V) Server & Script Development

      Rust Server Modding & Administration

      Setting up & Optimizing ARK Survival Servers

    NodeZone.net – Deine Community für Gameserver, Server-Hosting & Modding

      NodeZone.net ist dein Forum für Gameserver-Hosting, Rootserver, vServer, Webhosting und Modding. Seit 2015 bietet unsere Community eine zentrale Anlaufstelle für Server-Admins, Gamer und Technikbegeisterte, die sich über Server-Management, Hosting-Lösungen und Spielemodding austauschen möchten.


      Ob Anleitungen für eigene Gameserver, Hilfe bei Root- und vServer-Konfigurationen oder Tipps zu Modding & Scripting – bei uns findest du fundiertes Wissen und praxisnahe Tutorials. Mit einer stetig wachsenden Community findest du hier Antworten auf deine Fragen, Projektpartner und Gleichgesinnte für deine Gaming- und Serverprojekte. Schließe dich NodeZone.net an und werde Teil einer aktiven Community rund um Server-Hosting, Gameserver-Management und Modding-Ressourcen.

    Wer jetzt nicht teilt ist selber Schuld:
    1. Nutzungsbestimmungen
    2. Datenschutzerklärung
    3. Impressum
    4. Urheberrechts- oder Lizenzverstoß melden
  • Trimax Design coded & layout by Gino Zantarelli 2023-2025©
    Community-Software: WoltLab Suite™