Advertisement
iKurdo

init.c

Jan 2nd, 2025
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 33.84 KB | Gaming | 0 0
  1. void main()
  2. {
  3.     //INIT ECONOMY--------------------------------------
  4.     Hive ce = CreateHive();
  5.     if ( ce )
  6.         ce.InitOffline();
  7.  
  8.     //DATE RESET AFTER ECONOMY INIT-------------------------
  9.     int year, month, day, hour, minute;
  10.     int reset_month = 9, reset_day = 20;
  11.     GetGame().GetWorld().GetDate(year, month, day, hour, minute);
  12.  
  13.     if ((month == reset_month) && (day < reset_day))
  14.     {
  15.         GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
  16.     }
  17.     else
  18.     {
  19.         if ((month == reset_month + 1) && (day > reset_day))
  20.         {
  21.             GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
  22.         }
  23.         else
  24.         {
  25.             if ((month < reset_month) || (month > reset_month + 1))
  26.             {
  27.                 GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
  28.             }
  29.         }
  30.     }
  31. }
  32.  
  33. class CustomMission: MissionServer
  34. {
  35.     // SteamIDs of all VIPS players stored here
  36.     private ref TStringArray m_vips;
  37.    
  38.     // SteamIDs of all admin players stored here
  39.     private ref TStringArray m_admins;
  40.    
  41.     // Players that have God Mode enabled, listed here
  42.     private ref TIntArray m_gods;
  43.    
  44.     // Keep track of internal call queue limit to prevent overloads
  45.     private int m_calls;
  46.    
  47.     // Limit the number of function calls
  48.     // TODO: figure out proper limit when the performance starts to degrade
  49.     // TODO make constant
  50.     private int CALLS_LIMIT;
  51.    
  52.     override void OnInit()
  53.     {
  54.         super.OnInit();
  55.        
  56.         // Initialize needed class members here
  57.         m_calls = 0;
  58.         CALLS_LIMIT = 50;
  59.  
  60.         m_vips = new TStringArray;
  61.         m_admins = new TStringArray;
  62.         m_gods = new TIntArray;
  63.        
  64.         LoadVips();
  65.         LoadAdmins();
  66.     }
  67.    
  68.     void LoadVips()
  69.     {
  70.         string path = "$profile:Vips.txt";
  71.        
  72.         FileHandle file = OpenFile(path, FileMode.READ);
  73.        
  74.         // If file doesnt exist, create it
  75.         if ( file == 0 ) {
  76.             file = OpenFile(path, FileMode.WRITE);
  77.            
  78.             FPrintln(file, "// This file contains SteamID64 of all server VIPS. Add them below.");
  79.             FPrintln(file, "// Line starting with // means a comment line.");
  80.            
  81.             CloseFile(file);
  82.             return;
  83.         }
  84.        
  85.         string line;
  86.        
  87.         while ( FGets( file, line ) > 0 )
  88.         {
  89.             if (line.Length() < 2) continue;
  90.             if (line.Get(0) + line.Get(1) == "//") continue;
  91.            
  92.             m_vips.Insert(line);
  93.         }
  94.        
  95.         CloseFile(file);
  96.     }
  97.  
  98.     void LoadAdmins()
  99.     {
  100.         string path = "$profile:admins.txt";
  101.        
  102.         FileHandle file = OpenFile(path, FileMode.READ);
  103.        
  104.         // If file doesnt exist, create it
  105.         if ( file == 0 ) {
  106.             file = OpenFile(path, FileMode.WRITE);
  107.            
  108.             FPrintln(file, "// This file contains SteamID64 of all server admins. Add them below.");
  109.             FPrintln(file, "// Line starting with // means a comment line.");
  110.            
  111.             CloseFile(file);
  112.             return;
  113.         }
  114.        
  115.         string line;
  116.        
  117.         while ( FGets( file, line ) > 0 )
  118.         {
  119.             if (line.Length() < 2) continue;
  120.             if (line.Get(0) + line.Get(1) == "//") continue;
  121.            
  122.             m_admins.Insert(line);
  123.         }
  124.        
  125.         CloseFile(file);
  126.     }
  127.  
  128.     bool Command(PlayerBase player, string command)
  129.     {
  130.         const string helpMsg = "Available commands: /help /car /warp /kill /give /gear /ammo /say /info /heal /god /suicide /here /there";
  131.  
  132.         // Split command message into args
  133.         TStringArray args = new TStringArray;
  134.         MySplit(command, " ", args);
  135.        
  136.         string arg;
  137.         PlayerBase target;
  138.         int dist;
  139.        
  140.         switch (args[0])
  141.         {
  142.             case "/car":
  143.                 if ( args.Count() != 2 ) {
  144.                     SendPlayerMessage(player, "Syntax: /car [TYPE] - Spawn a vehicle");
  145.                     SpawnCar(player, "help");
  146.                     return false;
  147.                 }
  148.                 SpawnCar(player, args[1]);
  149.                 break;
  150.                
  151.             case "/warp":
  152.                 if ( args.Count() < 3 ) {
  153.                 SendPlayerMessage(player, "Syntax: /warp [X] [Z] - Teleport to [X, Z]");
  154.                     return false;
  155.                 }
  156.                 string pos = args[1] + " " + "0" + " " + args[2];
  157.                 SafeSetPos(player, pos);
  158.                 SendPlayerMessage(player, "Teleported to: " + pos);
  159.                 break;
  160.                
  161.             case "/heal":
  162.                 if ( args.Count() != 1 ) {
  163.                     SendPlayerMessage(player, "Syntax: /heal - Set all health statuses to max");
  164.                     return false;
  165.                 }
  166.                 RestoreHealth(player);
  167.                 break;
  168.                
  169.             case "/gear":
  170.                 if ( args.Count() != 2 ) {
  171.                     SendPlayerMessage(player, "Syntax: /gear [TYPE] - Spawn item loadout to self");
  172.                     SpawnGear(player, "help");
  173.                     return false;
  174.                 }
  175.                 if (SpawnGear(player, args[1])) {
  176.                     SendPlayerMessage(player, "Gear spawned.");
  177.                 }
  178.                 break;
  179.                
  180.             case "/ammo":
  181.                 // Args count: 2 <= x <= 3
  182.                 if ( args.Count() < 2 || args.Count() > 3 ) {
  183.                     SendPlayerMessage(player, "Syntax: /ammo [FOR_WEAPON] (AMOUNT) - Spawn mags and ammo for weapon");
  184.                     SpawnAmmo(player, "help");
  185.                     return false;
  186.                 }
  187.                 if ( args.Count() == 3 && SpawnAmmo(player, args[1], args[2].ToInt()) ) {
  188.                     SendPlayerMessage(player, "Ammo spawned.");
  189.                 }
  190.                 else if ( args.Count() == 2 && SpawnAmmo(player, args[1]) ) {
  191.                     SendPlayerMessage(player, "Ammo spawned.");
  192.                 }
  193.                 break;
  194.                
  195.             case "/info":
  196.                 if ( args.Count() < 1 || args.Count() > 2 ) {
  197.                     SendPlayerMessage(player, "Syntax: /info (0/1) - Get information about players on the server or set continuous info on/off");
  198.                     return false;
  199.                 }
  200.                 if (args.Count() == 2) {
  201.                     arg = args[1];
  202.                     arg.ToLower();
  203.                    
  204.                     if (arg.ToInt() == 1) {
  205.                         GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.PlayerInfo, 20000, true, player);
  206.                         SendPlayerMessage(player, "Continuous info mode enabled.");
  207.                         break;
  208.                     }
  209.                     else if (arg.ToInt() == 0) {
  210.                         GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.PlayerInfo);
  211.                         SendPlayerMessage(player, "Continuous info mode disabled.");
  212.                     }
  213.                 }
  214.                 else {
  215.                     PlayerInfo(player);
  216.                 }
  217.                 break;
  218.                
  219.             case "/say":
  220.                 if ( args.Count() < 2 ) {
  221.                     SendPlayerMessage(player, "Syntax: /say [MESSAGE] - Global announcement to all players");
  222.                     return false;
  223.                 }
  224.                
  225.                 // Form the message string from the command text and send to all players
  226.                 string msg = command.Substring( 5, command.Length() - 5 );
  227.                
  228.                 SendGlobalMessage(msg);
  229.                 break;
  230.                
  231.             case "/spawn":
  232.                 return false;
  233.                
  234.             case "/god":
  235.                 if ( args.Count() != 2 ) {
  236.                     SendPlayerMessage(player, "Syntax: /god [0-1] - Enable or disable semi god mode (BEWARE: huge damage in short timespan can still kill you!)");
  237.                     return false;
  238.                 }
  239.                
  240.                 int setGod = args[1].ToInt();
  241.                 int pId = player.GetID();
  242.  
  243.                 // Add player to gods, call godmode function every 1 sec
  244.                 if (setGod == 1) {
  245.                    
  246.                     if ( m_gods.Find(pId) != -1 ) {
  247.                         SendPlayerMessage(player, "You are already god.");
  248.                         return false;
  249.                     }
  250.  
  251.                     // Here we only need to add the new call to queue
  252.                     // However make sure we are within safe limits
  253.                     // TODO: Figure out more robust system to ensure performance does not degrade over time
  254.                     if (m_calls < CALLS_LIMIT) {
  255.                         m_gods.Insert( pId );
  256.                         GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.GodMode, 1000, true, player);
  257.                         m_calls += 1;
  258.                         SendPlayerMessage(player, "God mode enabled.");
  259.                     } else {
  260.                         SendPlayerMessage(player, "ERROR: Call queue limit reached. Please try again later.");
  261.                     }
  262.                 }
  263.                 // Do vice versa except for other gods
  264.                 else if (setGod == 0) {
  265.                     // Remove player id from gods list if found
  266.                     int godIdx = m_gods.Find( pId );
  267.  
  268.                     if (godIdx == -1) {
  269.                         SendPlayerMessage(player, "God mode not currently enabled for player.");
  270.                         return false;
  271.                     }
  272.                     else {
  273.                         m_gods.Remove(godIdx);
  274.                     }
  275.                    
  276.                     // The problem is we cant remove the interval function call for a specific player
  277.                     // We also dont want to check for all god players in a single fucntion call => too slow
  278.                     // Thus we need to re-queue the function call for each god player separately (serverside)
  279.                     // Remove godmode function from call queue but add again for remaining gods
  280.                     RefreshGodQueue();
  281.                    
  282.                     SendPlayerMessage(player, "Godmode disabled.");
  283.                 }
  284.                 else {
  285.                     SendPlayerMessage(player, "ERROR: Invalid argument given. Argument should be: 0-1");
  286.                     return false;
  287.                 }
  288.                 break;
  289.                
  290.             case "/give":
  291.                 if ( args.Count() < 2 || args.Count() > 3 ) {
  292.                     SendPlayerMessage(player, "Syntax: /give [ITEM_NAME] (AMOUNT) - Spawn item on ground, default amount is 1");
  293.                     return false;
  294.                 }
  295.                
  296.                 EntityAI item = player.SpawnEntityOnGroundPos(args[1], player.GetPosition());
  297.                
  298.                 if (!item) {
  299.                     SendPlayerMessage(player, "ERROR: Could not create item.");
  300.                     return false;
  301.                 }
  302.                 if ( args.Count() == 3 ) {
  303.                    
  304.                     int itemCount = args[2].ToInt();
  305.                    
  306.                     if (itemCount <= 0) {
  307.                         SendPlayerMessage(player, "ERROR: Invalid count.");
  308.                         return false;
  309.                     }
  310.                    
  311.                     // Spawn the rest of the items if count was specified and valid
  312.                     for (int i = 0; i < itemCount - 1; i++) {
  313.                         player.SpawnEntityOnGroundPos(args[1], player.GetPosition());
  314.                     }
  315.                 }
  316.                 SendPlayerMessage(player, "Item(s) spawned.");
  317.                 break;
  318.                
  319.             case "/here":
  320.                 if ( args.Count() < 2 ) {
  321.                     SendPlayerMessage(player, "Syntax: /here '[PLAYER IDENTITY]' (DISTANCE) - Moves a player to self, remember to use single quotes around identity");
  322.                     return false;
  323.                 }
  324.                
  325.                 PrepareTeleport(command, args, target, dist);
  326.                
  327.                 if (!target) {
  328.                     SendPlayerMessage(player, "Could not found target player.");
  329.                     return false;
  330.                 }              
  331.                 if (dist < 1) {
  332.                     SendPlayerMessage(player, "Invalid distance.");
  333.                     return false;
  334.                 }
  335.                 TeleportPlayer(target, player, dist);                  
  336.                 break;
  337.                
  338.             case "/there":
  339.                 if ( args.Count() < 2 ) {
  340.                     SendPlayerMessage(player, "Syntax: /there '[PLAYER IDENTITY]' (DISTANCE) - Moves self to a player");
  341.                     return false;
  342.                 }
  343.                
  344.                 PrepareTeleport(command, args, target, dist);
  345.                
  346.                 if (!target) {
  347.                     SendPlayerMessage(player, "Could not found target player.");
  348.                     return false;
  349.                 }              
  350.                 if (dist < 1) {
  351.                     SendPlayerMessage(player, "Invalid distance.");
  352.                     return false;
  353.                 }
  354.                 TeleportPlayer(player, target, dist);                  
  355.                 break;
  356.  
  357.             case "/suicide":
  358.                 if ( args.Count() != 1 ) {
  359.                     SendPlayerMessage(player, "Syntax: /suicide - Commit a suicide");
  360.                     return false;
  361.                 }
  362.                
  363.                 // Use SteamID here for sake of certainty
  364.                 if (!KillPlayer( player.GetIdentity().GetPlainId() )) {
  365.                     SendPlayerMessage(player, "Could not commit suicide.");
  366.                 }
  367.                 break;
  368.  
  369.             case "/kill":
  370.                 if ( args.Count() < 2 ) {
  371.                     SendPlayerMessage(player, "Syntax: /kill '[PLAYER IDENTITY]' - Kills a player by given identity, use single quotes around");
  372.                     return false;
  373.                 }
  374.                
  375.                 arg = MyTrim(command, "'");
  376.                
  377.                 if (!KillPlayer(arg)) {
  378.                     SendPlayerMessage(player, "Error: Could not kill player.");
  379.                 }  
  380.                 break;
  381.  
  382.             case "/help":
  383.                 SendPlayerMessage(player, helpMsg);
  384.                 return false;
  385.  
  386.             default:
  387.                 SendPlayerMessage(player, "Unknown command!");
  388.                 SendPlayerMessage(player, helpMsg);
  389.                 return false;
  390.         }
  391.        
  392.         return true;
  393.     }
  394.    
  395.     void PrepareTeleport(string cmd, TStringArray args, out PlayerBase target, out int distance)
  396.     {
  397.         // Parse target player name: "...stuff 'input' stuff..." -> "input"
  398.         string name = MyTrim(cmd, "'");
  399.        
  400.         distance = args[args.Count() - 1].ToInt();
  401.         target = GetPlayer(name, Identity.ANY);
  402.     }
  403.    
  404.     bool SpawnAmmo(PlayerBase player, string type, int amount = 1)
  405.     {
  406.         type.ToLower();
  407.        
  408.         const string helpMsg = "Available ammo types: svd, m4, akm, fx45";
  409.  
  410.         vector pos = player.GetPosition();
  411.         pos[0] = pos[0] + 1;
  412.         pos[1] = pos[1] + 1;
  413.         pos[2] = pos[2] + 1;
  414.        
  415.         string mag;
  416.         string ammo;
  417.        
  418.         switch (type)
  419.         {
  420.             case "svd":
  421.                 mag = "Mag_SVD_10Rnd";
  422.                 ammo = "AmmoBox_762x54Tracer_20Rnd";
  423.                 break;
  424.            
  425.             case "m4":
  426.                 mag = "Mag_STANAG_30Rnd";
  427.                 ammo = "AmmoBox_556x45Tracer_20Rnd";
  428.                 break;
  429.                
  430.             case "akm":
  431.                 mag = "Mag_AKM_30Rnd";
  432.                 ammo = "AmmoBox_762x39Tracer_20Rnd";
  433.                 break;
  434.            
  435.             case "fx45":
  436.                 mag = "Mag_FNX45_15Rnd";
  437.                 ammo = "AmmoBox_45ACP_25rnd";
  438.                 break;
  439.  
  440.             case "help":
  441.                 SendPlayerMessage(player, helpMsg);
  442.                 return false;
  443.            
  444.             default:
  445.                 SendPlayerMessage(player, "Invalid ammo type.");
  446.                 SendPlayerMessage(player, helpMsg);
  447.                 return false;
  448.         }
  449.        
  450.         for (int i = 0; i < amount; i++)
  451.         {
  452.             player.SpawnEntityOnGroundPos(mag, pos);
  453.             player.SpawnEntityOnGroundPos(ammo, pos);
  454.         }
  455.        
  456.         return true;
  457.     }
  458.  
  459.     // Just keep track of the active calls, no boundary checks here
  460.     void RefreshGodQueue()
  461.     {
  462.         GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.GodMode);
  463.         m_calls = 0;
  464.  
  465.         foreach (int pId : m_gods)
  466.         {
  467.             PlayerBase godPlayer = GetPlayer(pId.ToString(), Identity.PID);
  468.             if (!godPlayer) {
  469.                 m_gods.Remove( pId );
  470.                 continue;
  471.             }
  472.             GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.GodMode, 1000, true, godPlayer);
  473.             m_calls += 1;
  474.         }
  475.     }
  476.  
  477.     void GodMode(PlayerBase player)
  478.     {
  479. //      // if we only had the PID
  480. //      PlayerBase player = GetPlayer(pId.ToString(), Identity.PID);
  481.  
  482.         // If invalid player
  483.         if (!player) {
  484.             // Make sure this function call gets removed from the queue
  485.             // So the function call queue does not get overloaded
  486.             // Refresh call takes care of removing invalid PIDs
  487.             RefreshGodQueue();
  488.             return;
  489.         }
  490.        
  491.         int pId = player.GetID();
  492.        
  493.         // If player is not god, do nothing
  494.         if (m_gods.Find( pId ) == -1) {
  495.             // Refresh at this point to get the pid removed from the list
  496.             RefreshGodQueue();
  497.             return;
  498.         }
  499.  
  500.         // If player already dead, make sure godmode gets disabled
  501.         if (player.GetHealth("", "") <= 0.0) {
  502.             // We have just checked pid is in the list, so manually remove the pid and refresh
  503.             m_gods.Remove( pId );
  504.             RefreshGodQueue();
  505.             return;
  506.         }
  507.        
  508.         // Set all health statuses to maximum
  509.         RestoreHealth(player);
  510.     }
  511.    
  512.     void RestoreHealth(PlayerBase player)
  513.     {
  514.         if (!player) return;
  515.        
  516.         player.SetHealth("GlobalHealth", "Blood", player.GetMaxHealth("GlobalHealth", "Blood"));
  517.         player.SetHealth("GlobalHealth", "Health", player.GetMaxHealth("GlobalHealth", "Health"));
  518.         player.SetHealth("GlobalHealth", "Shock", player.GetMaxHealth("GlobalHealth", "Shock"));
  519.     }
  520.    
  521.     bool SpawnCar(PlayerBase player, string type)
  522.     {
  523.         type.ToLower();
  524.        
  525.         const string helpMsg = "Available types: offroad, olga, olgablack, sarka, gunter";
  526.        
  527.         // Set car pos near player
  528.         vector pos = player.GetPosition();
  529.         pos[0] = pos[0] + 3;
  530.         pos[1] = pos[1] + 3;
  531.         pos[2] = pos[2] + 3;
  532.  
  533.         Car car;
  534.        
  535.         switch (type)
  536.         {
  537.             case "offroad":
  538.                 // Spawn and build the car
  539.                 car = GetGame().CreateObject("OffroadHatchback", pos);
  540.                 car.GetInventory().CreateAttachment("HatchbackTrunk");
  541.                 car.GetInventory().CreateAttachment("HatchbackHood");
  542.                 car.GetInventory().CreateAttachment("HatchbackDoors_CoDriver");
  543.                 car.GetInventory().CreateAttachment("HatchbackDoors_Driver");
  544.                 car.GetInventory().CreateAttachment("HatchbackWheel");
  545.                 car.GetInventory().CreateAttachment("HatchbackWheel");
  546.                 car.GetInventory().CreateAttachment("HatchbackWheel");
  547.                 car.GetInventory().CreateAttachment("HatchbackWheel");
  548.                
  549.                 SendPlayerMessage(player, "OffroadHatchback spawned.");
  550.                 break;
  551.            
  552.             case "olga":
  553.                 // Spawn and build the car
  554.                 car = GetGame().CreateObject("CivilianSedan", pos);
  555.                 car.GetInventory().CreateAttachment("CivSedanHood");
  556.                 car.GetInventory().CreateAttachment("CivSedanTrunk");
  557.                 car.GetInventory().CreateAttachment("CivSedanDoors_Driver");
  558.                 car.GetInventory().CreateAttachment("CivSedanDoors_CoDriver");
  559.                 car.GetInventory().CreateAttachment("CivSedanDoors_BackLeft");
  560.                 car.GetInventory().CreateAttachment("CivSedanDoors_BackRight");
  561.                 car.GetInventory().CreateAttachment("CivSedanWheel");
  562.                 car.GetInventory().CreateAttachment("CivSedanWheel");
  563.                 car.GetInventory().CreateAttachment("CivSedanWheel");
  564.                 car.GetInventory().CreateAttachment("CivSedanWheel");
  565.                
  566.                 SendPlayerMessage(player, "CivSedan spawned.");
  567.                 break;
  568.                
  569.             case "olgablack":
  570.                 // Spawn and build the car
  571.                 car = GetGame().CreateObject("CivilianSedan_Black", pos);
  572.                 car.GetInventory().CreateAttachment("CivSedanHood_Black");
  573.                 car.GetInventory().CreateAttachment("CivSedanTrunk_Black");
  574.                 car.GetInventory().CreateAttachment("CivSedanDoors_Driver_Black");
  575.                 car.GetInventory().CreateAttachment("CivSedanDoors_CoDriver_Black");
  576.                 car.GetInventory().CreateAttachment("CivSedanDoors_BackLeft_Black");
  577.                 car.GetInventory().CreateAttachment("CivSedanDoors_BackRight_Black");
  578.                 car.GetInventory().CreateAttachment("CivSedanWheel");
  579.                 car.GetInventory().CreateAttachment("CivSedanWheel");
  580.                 car.GetInventory().CreateAttachment("CivSedanWheel");
  581.                 car.GetInventory().CreateAttachment("CivSedanWheel");
  582.                
  583.                 SendPlayerMessage(player, "CivSedan_Black spawned.");
  584.                 break;
  585.                
  586.             case "sarka":
  587.                 // Spawn and build the car
  588.                 car = GetGame().CreateObject("Sedan_02", pos);
  589.                 car.GetInventory().CreateAttachment("Sedan_02_Hood");
  590.                 car.GetInventory().CreateAttachment("Sedan_02_Trunk");
  591.                 car.GetInventory().CreateAttachment("Sedan_02_Door_1_1");
  592.                 car.GetInventory().CreateAttachment("Sedan_02_Door_1_2");
  593.                 car.GetInventory().CreateAttachment("Sedan_02_Door_2_1");
  594.                 car.GetInventory().CreateAttachment("Sedan_02_Door_2_2");
  595.                 car.GetInventory().CreateAttachment("Sedan_02_Wheel");
  596.                 car.GetInventory().CreateAttachment("Sedan_02_Wheel");
  597.                 car.GetInventory().CreateAttachment("Sedan_02_Wheel");
  598.                 car.GetInventory().CreateAttachment("Sedan_02_Wheel");
  599.                
  600.                 SendPlayerMessage(player, "Sedan_02 spawned.");
  601.                 break;
  602.  
  603.             case "gunter":
  604.                 // Spawn and build the car
  605.                 car = GetGame().CreateObject("Hatchback_02", pos);
  606.                 car.GetInventory().CreateAttachment("Hatchback_02_Hood");
  607.                 car.GetInventory().CreateAttachment("Hatchback_02_Trunk");
  608.                 car.GetInventory().CreateAttachment("Hatchback_02_Door_1_1");
  609.                 car.GetInventory().CreateAttachment("Hatchback_02_Door_1_2");
  610.                 car.GetInventory().CreateAttachment("Hatchback_02_Door_2_1");
  611.                 car.GetInventory().CreateAttachment("Hatchback_02_Door_2_2");
  612.                 car.GetInventory().CreateAttachment("Hatchback_02_Wheel");
  613.                 car.GetInventory().CreateAttachment("Hatchback_02_Wheel");
  614.                 car.GetInventory().CreateAttachment("Hatchback_02_Wheel");
  615.                 car.GetInventory().CreateAttachment("Hatchback_02_Wheel");
  616.                
  617.                 SendPlayerMessage(player, "Hatchback_02 spawned.");
  618.                 break;
  619.                
  620.             case "help":
  621.                 SendPlayerMessage(player, helpMsg);
  622.                 return false;
  623.                
  624.             default:
  625.                 SendPlayerMessage(player, "ERROR: Car type invalid.");
  626.                 SendPlayerMessage(player, helpMsg);
  627.                 return false;
  628.         }
  629.        
  630.         // A car was spawned, so we do some common car configuration
  631.  
  632.         // Do general car building matching all car types
  633.         car.GetInventory().CreateAttachment("CarRadiator");
  634.         car.GetInventory().CreateAttachment("CarBattery");
  635.         car.GetInventory().CreateAttachment("SparkPlug");
  636.         car.GetInventory().CreateAttachment("HeadlightH7");
  637.         car.GetInventory().CreateAttachment("HeadlightH7");
  638.        
  639.         // Fill all the fluids
  640.         car.Fill(CarFluid.FUEL, car.GetFluidCapacity(CarFluid.FUEL));
  641.         car.Fill(CarFluid.OIL, car.GetFluidCapacity(CarFluid.OIL));
  642.         car.Fill(CarFluid.BRAKE, car.GetFluidCapacity(CarFluid.BRAKE));
  643.         car.Fill(CarFluid.COOLANT, car.GetFluidCapacity(CarFluid.COOLANT));
  644.        
  645.         // Set neutral gear
  646.         car.GetController().ShiftTo(CarGear.NEUTRAL);
  647.        
  648.         return true;
  649.     }
  650.    
  651.     void SafeSetPos(PlayerBase player, string pos)
  652.     {
  653.         // Safe conversion
  654.         vector p = pos.ToVector();
  655.        
  656.         // Check that position is a valid coordinate
  657.         // 0 0 0 wont be accepted even though valid
  658.         if (p) {
  659.             // Get safe surface value for Y coordinate in that position
  660.             p[1] = GetGame().SurfaceY(p[0], p[2]);
  661.             player.SetPosition(p);
  662.             return;
  663.         }
  664.        
  665.         SendPlayerMessage(player, "Invalid coordinates.");
  666.     }
  667.    
  668.     void PlayerInfo(PlayerBase player)
  669.     {
  670.         if (!player) {
  671.             GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.PlayerInfo);
  672.             return;
  673.         }
  674.        
  675.         // Clear chat history first
  676.         for (int x = 0; x < 15; x++) {
  677.             SendPlayerMessage(player, " ");
  678.         }
  679.        
  680.         ref array<Man> players = new array<Man>;
  681.         GetGame().GetPlayers( players );
  682.  
  683.         // Send player count
  684.         SendPlayerMessage(player, "Players on server: " + players.Count());
  685.        
  686.         // Maximum amount of single line entries that fit in the chat history: 12
  687.         int max = 10;
  688.        
  689.         if ( players.Count() < max )
  690.             max = players.Count();
  691.        
  692.         PlayerBase p;
  693.  
  694.         for ( int i = 0; i < max; ++i )
  695.         {
  696.             //if (i > 0)
  697.             //  SendPlayerMessage(player, "*");
  698.            
  699.             Class.CastTo(p, players.Get(i));
  700.            
  701.             string info = "Player {" + string.ToString(i, false, false, false) + "}";
  702.             info = info + "  " + "Name: " + p.GetIdentity().GetName();
  703.             info = info + "  " + "Pos: " + p.GetPosition().ToString();
  704.             info = info + "  " + "Health: " + p.GetHealth("GlobalHealth", "Health");
  705.             info = info + "  " + "Blood: " + p.GetHealth("GlobalHealth", "Blood");
  706.             info = info + "  " + "Shock: " + p.GetHealth("GlobalHealth", "Shock");
  707.             info = info + "  " + "PlayerID: " + p.GetID();
  708.             info = info + "  " + "SteamID64: " + p.GetIdentity().GetPlainId();
  709.  
  710.             SendPlayerMessage(player, info);
  711.         }
  712.        
  713.         SendPlayerMessage(player, " ");
  714.     }
  715.  
  716.     bool SpawnGear(PlayerBase player, string type)
  717.     {
  718.         type.ToLower();
  719.        
  720.         const string helpMsg = "Available types: mil, ghillie, medic, nv, svd, m4, akm, fx45";
  721.  
  722.         vector pos = player.GetPosition();
  723.         pos[0] = pos[0] + 1;
  724.         pos[1] = pos[1] + 1;
  725.         pos[2] = pos[2] + 1;
  726.        
  727.         // DONT spawn a mag as attachment, is buggy ingame, spawn mags in ground instead
  728.         EntityAI item;
  729.         EntityAI subItem;
  730.  
  731.         switch (type)
  732.         {
  733.             case "mil":
  734.                 // Head
  735.                 item = player.SpawnEntityOnGroundPos("Mich2001Helmet", pos);
  736.                
  737.                 subItem = item.GetInventory().CreateAttachment("NVGoggles");
  738.                 subItem.GetInventory().CreateAttachment("Battery9V");
  739.                
  740.                 subItem = item.GetInventory().CreateAttachment("UniversalLight");
  741.                 subItem.GetInventory().CreateAttachment("Battery9V");
  742.                
  743.                 player.SpawnEntityOnGroundPos("GP5GasMask", pos);
  744.                
  745.                 // Vest
  746.                 item = player.SpawnEntityOnGroundPos("SmershVest", pos);
  747.                 item.GetInventory().CreateAttachment("SmershBag");
  748.                
  749.                 // Body
  750.                 player.SpawnEntityOnGroundPos("TTsKOJacket_Camo", pos);
  751.                 player.SpawnEntityOnGroundPos("TTSKOPants", pos);
  752.                 player.SpawnEntityOnGroundPos("OMNOGloves_Gray", pos);
  753.                
  754.                 // Waist
  755.                 item = player.SpawnEntityOnGroundPos("MilitaryBelt", pos);
  756.                 item.GetInventory().CreateAttachment("Canteen");
  757.                 item.GetInventory().CreateAttachment("PlateCarrierHolster");
  758.                
  759.                 subItem = item.GetInventory().CreateAttachment("NylonKnifeSheath");
  760.                 subItem.GetInventory().CreateAttachment("CombatKnife");
  761.                
  762.                 // Legs
  763.                 item = player.SpawnEntityOnGroundPos("MilitaryBoots_Black", pos);
  764.                 item.GetInventory().CreateAttachment("CombatKnife");
  765.                
  766.                 // Back
  767.                 player.SpawnEntityOnGroundPos("AliceBag_Camo", pos);
  768.  
  769.                 break;
  770.  
  771.             case "ghillie":
  772.                 player.SpawnEntityOnGroundPos("GhillieAtt_Woodland", pos);
  773.                 player.SpawnEntityOnGroundPos("GhillieAtt_Woodland", pos);
  774.                 player.SpawnEntityOnGroundPos("GhillieBushrag_Woodland", pos);
  775.                 player.SpawnEntityOnGroundPos("GhillieHood_Woodland", pos);
  776.                 player.SpawnEntityOnGroundPos("GhillieSuit_Woodland", pos);
  777.                 player.SpawnEntityOnGroundPos("GhillieTop_Woodland", pos);
  778.                
  779.                 break;
  780.                
  781.             case "svd":
  782.                 item = player.SpawnEntityOnGroundPos("SVD", pos);
  783.                
  784.                 item.GetInventory().CreateAttachment("AK_Suppressor");
  785.                
  786.                 subItem = item.GetInventory().CreateAttachment("PSO1Optic");
  787.                 subItem.GetInventory().CreateAttachment("Battery9V");
  788.                
  789.                 item = player.SpawnEntityOnGroundPos("KazuarOptic", pos);
  790.                 item.GetInventory().CreateAttachment("Battery9V");             
  791.                
  792.                 player.SpawnEntityOnGroundPos("Mag_SVD_10Rnd", pos);
  793.                 player.SpawnEntityOnGroundPos("Mag_SVD_10Rnd", pos);
  794.                 player.SpawnEntityOnGroundPos("Mag_SVD_10Rnd", pos);
  795.                 player.SpawnEntityOnGroundPos("Mag_SVD_10Rnd", pos);
  796.                
  797.                 break;
  798.            
  799.             case "m4":
  800.                 item = player.SpawnEntityOnGroundPos("M4A1", pos);
  801.                
  802.                 item.GetInventory().CreateAttachment("M4_Suppressor");
  803.                 item.GetInventory().CreateAttachment("M4_OEBttstck");
  804.                 item.GetInventory().CreateAttachment("M4_RISHndgrd");
  805.                
  806.                 subItem = item.GetInventory().CreateAttachment("ReflexOptic");
  807.                 subItem.GetInventory().CreateAttachment("Battery9V");
  808.        
  809.                 subItem = item.GetInventory().CreateAttachment("UniversalLight");
  810.                 subItem.GetInventory().CreateAttachment("Battery9V");
  811.                
  812.                 player.SpawnEntityOnGroundPos("Mag_STANAG_30Rnd", pos);
  813.                 player.SpawnEntityOnGroundPos("Mag_STANAG_30Rnd", pos);
  814.                 player.SpawnEntityOnGroundPos("Mag_STANAG_30Rnd", pos);
  815.                
  816.                 player.SpawnEntityOnGroundPos("ACOGOptic", pos);
  817.                
  818.                 break;
  819.                
  820.             case "akm":
  821.                 item = player.SpawnEntityOnGroundPos("AKM", pos);
  822.                
  823.                 item.GetInventory().CreateAttachment("AK_Suppressor");
  824.                 item.GetInventory().CreateAttachment("AK_WoodBttstck");
  825.                 item.GetInventory().CreateAttachment("AK_RailHndgrd");
  826.                
  827.                 subItem = item.GetInventory().CreateAttachment("KobraOptic");
  828.                 subItem.GetInventory().CreateAttachment("Battery9V");
  829.                
  830.                 subItem = item.GetInventory().CreateAttachment("UniversalLight");
  831.                 subItem.GetInventory().CreateAttachment("Battery9V");
  832.                
  833.                 item = player.SpawnEntityOnGroundPos("PSO1Optic", pos);
  834.                 item.GetInventory().CreateAttachment("Battery9V");
  835.  
  836.                 player.SpawnEntityOnGroundPos("Mag_AKM_30Rnd", pos);
  837.                 player.SpawnEntityOnGroundPos("Mag_AKM_30Rnd", pos);
  838.                 player.SpawnEntityOnGroundPos("Mag_AKM_Drum75Rnd", pos);
  839.  
  840.                 break;
  841.            
  842.             case "fx45":
  843.                 item = player.SpawnEntityOnGroundPos("FNX45", pos);
  844.                
  845.                 item.GetInventory().CreateAttachment("PistolSuppressor");
  846.                
  847.                 subItem = item.GetInventory().CreateAttachment("FNP45_MRDSOptic");
  848.                 subItem.GetInventory().CreateAttachment("Battery9V");
  849.                
  850.                 subItem = item.GetInventory().CreateAttachment("TLRLight");
  851.                 subItem.GetInventory().CreateAttachment("Battery9V");
  852.                
  853.                 player.SpawnEntityOnGroundPos("Mag_FNX45_15Rnd", pos);
  854.                 player.SpawnEntityOnGroundPos("Mag_FNX45_15Rnd", pos);
  855.                 player.SpawnEntityOnGroundPos("Mag_FNX45_15Rnd", pos);
  856.                
  857.                 break;
  858.            
  859.             case "nv":
  860.                 item = player.SpawnEntityOnGroundPos("NVGHeadstrap", pos);
  861.                
  862.                 subItem = item.GetInventory().CreateAttachment("NVGoggles");
  863.                 subItem.GetInventory().CreateAttachment("Battery9V");
  864.                
  865.                 break;
  866.                
  867.             case "medic":
  868.                 player.SpawnEntityOnGroundPos("BandageDressing", pos);
  869.                 player.SpawnEntityOnGroundPos("BandageDressing", pos);
  870.                 player.SpawnEntityOnGroundPos("BandageDressing", pos);
  871.                 player.SpawnEntityOnGroundPos("BandageDressing", pos);
  872.                 player.SpawnEntityOnGroundPos("SalineBagIV", pos);
  873.                 player.SpawnEntityOnGroundPos("Morphine", pos);
  874.                 player.SpawnEntityOnGroundPos("Epinephrine", pos);
  875.                
  876.                 break;
  877.                
  878.             case "mosin":
  879.                 break;
  880.                
  881.             case "sks":
  882.                 break;
  883.                
  884.             case "help":
  885.                 SendPlayerMessage(player, helpMsg);
  886.                 return false;
  887.            
  888.             default:
  889.                 SendPlayerMessage(player, "Invalid gear type.");
  890.                 SendPlayerMessage(player, helpMsg);
  891.                 return false;
  892.         }
  893.        
  894.         return true;
  895.     }
  896.  
  897.     void TeleportPlayer(PlayerBase from, PlayerBase to, int distance)
  898.     {
  899.         if (!from) return;
  900.         if (!to) return;
  901.        
  902.         vector toPos = to.GetPosition();
  903.  
  904.         float pos_x = toPos[0] + distance;
  905.         float pos_z = toPos[2] + distance;
  906.         float pos_y = GetGame().SurfaceY(pos_x, pos_z);
  907.        
  908.         vector pos = Vector(pos_x, pos_y, pos_z);
  909.        
  910.         from.SetPosition(pos);
  911.     }
  912.    
  913.     bool KillPlayer(string tag)
  914.     {
  915.         PlayerBase p = GetPlayer(tag, Identity.ANY);
  916.        
  917.         if (!p) return false;
  918.        
  919.         p.SetHealth("", "", -1);
  920.        
  921.         return true;
  922.     }
  923.    
  924.     override void OnEvent(EventType eventTypeId, Param params)
  925.     {
  926.         switch(eventTypeId)
  927.         {
  928.             // Handle user command
  929.             case ChatMessageEventTypeID:
  930.  
  931.                 ChatMessageEventParams chatParams;
  932.                 Class.CastTo(chatParams, params);
  933.                
  934.                 // Remove those stupid ' ' => Substring: x, false, false, quotes = false
  935.                
  936.                 // Check that input was a command (contains forward slash)
  937.                 string cmd = string.ToString(chatParams.param3, false, false, false);
  938.  
  939.                 // command format: /abc def ghi
  940.                 // if not command, is normal chat message
  941.                 if ( cmd.Get(0) != "/" ) break;
  942.                
  943.                 // Get sender player name as string
  944.                 string senderName = string.ToString(chatParams.param2, false, false, false);
  945.                
  946.                 // Get sender player object
  947.                 PlayerBase sender = GetPlayer(senderName, Identity.NAME);
  948.                
  949.                 // If fails to get the message sender, stop
  950.                 if (!sender) {
  951.                     return;
  952.                 }
  953.                
  954.                 // Check that player has sufficient privileges to execute commands
  955.                 if ( !IsVip(sender) ) {
  956.                     SendPlayerMessage(sender, "Sorry, you are not an Vip!");
  957.                     return;
  958.                 }
  959.  
  960.                 // Check that player has sufficient privileges to execute commands
  961.                 if ( !IsAdmin(sender) ) {
  962.                     SendPlayerMessage(sender, "Sorry, you are not an admin!");
  963.                     return;
  964.                 }
  965.  
  966.                 // Execute specified command
  967.                 Command(sender, cmd);
  968.                
  969.                 // Return after execution instead of breaking to prevent normal event handling
  970.                 return;
  971.         }
  972.        
  973.         // Unless chat command was executed, operate normally
  974.         // Call super class event handler to handle other events
  975.         super.OnEvent(eventTypeId, params);
  976.     }
  977.    
  978.     bool IsAdmin(PlayerBase player)
  979.     {
  980.         return m_admins.Find( player.GetIdentity().GetPlainId() ) != -1;
  981.     }
  982.  
  983.     bool IsVip(PlayerBase player)
  984.     {
  985.         return m_vips.Find( player.GetIdentity().GetPlainId() ) != -1;
  986.     }
  987.  
  988.     PlayerBase GetPlayer(string tag, Identity type)
  989.     {
  990.         ref array<Man> players = new array<Man>;
  991.         GetGame().GetPlayers( players );
  992.        
  993.         PlayerBase p;
  994.        
  995.         bool nameMatch;
  996.         bool steamIdMatch;
  997.         bool pidMatch;
  998.        
  999.         for ( int i = 0; i < players.Count(); ++i )
  1000.         {
  1001.             Class.CastTo(p, players.Get(i));
  1002.            
  1003.             // Store matches from different checks
  1004.             nameMatch = p.GetIdentity().GetName() == tag;
  1005.             steamIdMatch = p.GetIdentity().GetPlainId() == tag;
  1006.             pidMatch = p.GetID() == tag.ToInt();
  1007.            
  1008.             if ( type == Identity.ANY ) {
  1009.                 if ( nameMatch || steamIdMatch || pidMatch )
  1010.                     return p;
  1011.             }
  1012.            
  1013.             else if ( type == Identity.NAME ) {
  1014.                 if ( nameMatch )
  1015.                     return p;
  1016.             }
  1017.            
  1018.             else if ( type == Identity.STEAMID ) {
  1019.                 if ( steamIdMatch )
  1020.                     return p;
  1021.             }
  1022.  
  1023.             else if ( type == Identity.PID ) {
  1024.                 if ( pidMatch )
  1025.                     return p;
  1026.             }
  1027.         }
  1028.        
  1029.         // Player with given parameter not found
  1030.         return NULL;
  1031.     }
  1032.    
  1033.     void SendGlobalMessage(string message) 
  1034.     {
  1035.         ref array<Man> players = new array<Man>;
  1036.         GetGame().GetPlayers( players );
  1037.        
  1038.         for ( int i = 0; i < players.Count(); ++i )
  1039.         {
  1040.             Man player = players.Get(i);
  1041.             if ( player )
  1042.                 SendPlayerMessage(player, message);
  1043.         }
  1044.     }
  1045.    
  1046.     void SendPlayerMessage(PlayerBase player, string message)  
  1047.     {
  1048.         Param1<string> Msgparam;
  1049.         Msgparam = new Param1<string>(message);
  1050.         GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, player.GetIdentity());
  1051.     }
  1052.    
  1053.     string MyTrim(string text, string c)
  1054.     {
  1055.         if (text.Length() < 3) return "";
  1056.        
  1057.         int count = 0;
  1058.        
  1059.         int start = 0;
  1060.         int end = 0;
  1061.  
  1062.         for (int i = 0; i < text.Length(); i++)
  1063.         {
  1064.             if (text.Get(i) == c) {
  1065.                 count++;
  1066.                 start = i + 1;
  1067.                 break;
  1068.             }
  1069.         }
  1070.  
  1071.         for (int j = text.Length() - 1; j >= 0; j--)
  1072.         {
  1073.             if (text.Get(j) == c) {
  1074.                 count++;
  1075.                 end = j - 1;
  1076.                 break;
  1077.             }
  1078.         }
  1079.        
  1080.         // Return substring only if trimmed by c from both sides.
  1081.         if (count == 2) return text.Substring(start, end - start + 1);
  1082.        
  1083.         return "";
  1084.     }
  1085.    
  1086.     void MySplit(string text, string delim, out TStringArray list)
  1087.     {
  1088.         string temp = text + delim;
  1089.         string word = "";
  1090.        
  1091.         for (int i = 0; i < temp.Length(); i++ )
  1092.         {
  1093.             string x = temp.Get(i);
  1094.            
  1095.             if ( x != delim ) {
  1096.                 word = word + x;
  1097.             }
  1098.             else {
  1099.                 list.Insert(word);
  1100.                 word = "";
  1101.             }
  1102.         }
  1103.     }
  1104.    
  1105.     void SetRandomHealth(EntityAI itemEnt)
  1106.     {
  1107.         if ( itemEnt )
  1108.         {
  1109.             float rndHlt = Math.RandomFloat( 0.45, 0.65 );
  1110.             itemEnt.SetHealth01( "", "", rndHlt );
  1111.         }
  1112.     }
  1113.  
  1114.     override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)
  1115.     {
  1116.         Entity playerEnt;
  1117.         playerEnt = GetGame().CreatePlayer( identity, characterName, pos, 0, "NONE" );
  1118.         Class.CastTo( m_player, playerEnt );
  1119.  
  1120.         GetGame().SelectPlayer( identity, m_player );
  1121.  
  1122.         return m_player;
  1123.     }
  1124.  
  1125.     override void StartingEquipSetup(PlayerBase player, bool clothesChosen)
  1126.     {
  1127.         player.GetStatEnergy().Set(3000);
  1128.         player.GetStatWater().Set(3000);
  1129.         EntityAI itemClothing;
  1130.         EntityAI itemEnt;
  1131.         ItemBase itemBs;
  1132.         float rand;
  1133.  
  1134.         itemClothing = player.FindAttachmentBySlotName( "Body" );
  1135.         if ( itemClothing )
  1136.         {
  1137.             SetRandomHealth( itemClothing );
  1138.            
  1139.             itemEnt = itemClothing.GetInventory().CreateInInventory( "BandageDressing" );
  1140.             player.SetQuickBarEntityShortcut(itemEnt, 2);
  1141.            
  1142.             itemEnt = itemClothing.GetInventory().CreateInInventory( "StoneKnife" );
  1143.             player.SetQuickBarEntityShortcut(itemEnt, 0);
  1144.            
  1145.             string chemlightArray[] = { "Chemlight_White", "Chemlight_Yellow", "Chemlight_Green", "Chemlight_Red" };
  1146.             int rndIndex = Math.RandomInt( 0, 4 );
  1147.             itemEnt = itemClothing.GetInventory().CreateInInventory( chemlightArray[rndIndex] );
  1148.             SetRandomHealth( itemEnt );
  1149.             player.SetQuickBarEntityShortcut(itemEnt, 1);
  1150.  
  1151.             rand = Math.RandomFloatInclusive( 0.0, 1.0 );
  1152.             if ( rand < 0.35 )
  1153.                 itemEnt = player.GetInventory().CreateInInventory( "Apple" );
  1154.             else if ( rand > 0.65 )
  1155.                 itemEnt = player.GetInventory().CreateInInventory( "Pear" );
  1156.             else
  1157.                 itemEnt = player.GetInventory().CreateInInventory( "Plum" );
  1158.             player.SetQuickBarEntityShortcut(itemEnt, 3);
  1159.             SetRandomHealth( itemEnt );
  1160.         }
  1161.        
  1162.         itemClothing = player.FindAttachmentBySlotName( "Legs" );
  1163.         if ( itemClothing )
  1164.             SetRandomHealth( itemClothing );
  1165.        
  1166.         itemClothing = player.FindAttachmentBySlotName( "Feet" );
  1167.     }
  1168. };
  1169.  
  1170. enum Identity {
  1171.     ANY,
  1172.     NAME,
  1173.     STEAMID,
  1174.     PID
  1175. };
  1176.  
  1177. Mission CreateCustomMission(string path)
  1178. {
  1179.     return new CustomMission();
  1180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement