FlacoBey

Untitled

Jun 27th, 2019
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.42 KB | None | 0 0
  1. #pragma semicolon 1
  2. #pragma newdecls required
  3.  
  4. #include <sourcemod>
  5. #include <sdktools>
  6. #include <sdkhooks>
  7.  
  8. #define SOUND_PASS1         "animation/c130_flyby.wav"
  9.  
  10. #define MAXLIST 26
  11.  
  12. int gIndexCrate[2048+1];
  13. ConVar cTankChance, cDropType, cCountItems, cCountAirdrops, cTimeOpen, cUseString;
  14. bool IsLeft4Dead2;
  15.  
  16. public Plugin myinfo =
  17. {
  18.     name = "[L4D2] Airdrop",
  19.     author = "BHaType",
  20.     description = "Admin can call airdrop.",
  21.     version = "0.3",
  22.     url = "https://www.sourcemod.net/plugins.php?cat=0&mod=-1&title=&author=BHaType&description=&search=1"
  23. }
  24.  
  25. static const char gModeList[4][] =
  26. {
  27.     "models/props_vehicles/c130.mdl",
  28.     "models/props_crates/supply_crate02.mdl",
  29.     "models/props_crates/supply_crate02_gib1.mdl",
  30.     "models/props_junk/wood_crate001a.mdl"
  31. };
  32.  
  33. static const char gItemsListL4D1[MAXLIST - 18][] =
  34. {
  35.     "weapon_autoshotgun",
  36.     "weapon_first_aid_kit",
  37.     "weapon_pipe_bomb",
  38.     "weapon_molotov",
  39.     "weapon_rifle",
  40.     "weapon_hunting_rifle",
  41.     "weapon_pain_pills",
  42.     "weapon_pistol"
  43. };
  44.  
  45. static const char gItemsList[MAXLIST][] =
  46. {
  47.     "weapon_autoshotgun",
  48.     "weapon_first_aid_kit",
  49.     "weapon_pipe_bomb",
  50.     "weapon_molotov",
  51.     "weapon_rifle",
  52.     "weapon_hunting_rifle",
  53.     "weapon_pain_pills",
  54.     "weapon_pistol",
  55.     "weapon_adrenaline",
  56.     "weapon_smg_mp5",
  57.     "weapon_smg",
  58.     "weapon_smg_silenced",
  59.     "weapon_shotgun_chrome",
  60.     "weapon_pumpshotgun",
  61.     "weapon_rifle_m60",
  62.     "weapon_shotgun_spas",
  63.     "weapon_sniper_military",
  64.     "weapon_rifle_ak47",
  65.     "weapon_rifle_desert",
  66.     "weapon_sniper_awp",
  67.     "weapon_rifle_sg552",
  68.     "weapon_sniper_scout",
  69.     "weapon_grenade_launcher",
  70.     "weapon_pistol_magnum",
  71.     "weapon_vomitjar",
  72.     "weapon_defibrillator"
  73. };
  74.  
  75. static const char gModelsItemsList[MAXLIST][] =
  76. {
  77.     "models/w_models/weapons/w_autoshot_m4super.mdl",
  78.     "models/w_models/weapons/w_eq_Medkit.mdl",
  79.     "models/w_models/weapons/w_eq_pipebomb.mdl",
  80.     "models/w_models/weapons/w_eq_molotov.mdl",
  81.     "models/w_models/weapons/w_rifle_m16a2.mdl",
  82.     "models/w_models/weapons/w_sniper_mini14.mdl",
  83.     "models/w_models/weapons/w_eq_painpills.mdl",
  84.     "models/w_models/weapons/w_pistol_a.mdl",
  85.     "models/w_models/weapons/w_eq_adrenaline.mdl",
  86.     "models/w_models/weapons/w_smg_mp5.mdl",
  87.     "models/w_models/weapons/w_smg_uzi.mdl",
  88.     "models/w_models/weapons/w_smg_a.mdl",
  89.     "models/w_models/weapons/w_shotgun.mdl",
  90.     "models/w_models/weapons/w_pumpshotgun_a.mdl",
  91.     "models/w_models/weapons/w_m60.mdl",
  92.     "models/w_models/weapons/w_shotgun_spas.mdl",
  93.     "models/w_models/weapons/w_sniper_military.mdl",
  94.     "models/w_models/weapons/w_rifle_ak47.mdl",
  95.     "models/w_models/weapons/w_desert_rifle.mdl",
  96.     "models/w_models/weapons/w_sniper_awp.mdl",
  97.     "models/w_models/weapons/w_rifle_sg552.mdl",
  98.     "models/w_models/weapons/w_sniper_scout.mdl",
  99.     "models/w_models/weapons/w_grenade_launcher.mdl",
  100.     "models/w_models/weapons/w_desert_eagle.mdl",
  101.     "models/w_models/weapons/w_eq_bile_flask.mdl",
  102.     "models/w_models/weapons/w_eq_defibrillator.mdl"
  103. };
  104.  
  105. static int gAmmoList[MAXLIST] =
  106. {
  107.     90,
  108.     -1,
  109.     -1,
  110.     -1,
  111.     360,
  112.     150,
  113.     -1,
  114.     -1,
  115.     -1,
  116.     650,
  117.     650,
  118.     650,
  119.     56,
  120.     56,
  121.     -1,
  122.     90,
  123.     180,
  124.     360,
  125.     360,
  126.     180,
  127.     360,
  128.     180,
  129.     30,
  130.     -1,
  131.     -1,
  132.     -1
  133. };
  134.  
  135. public void OnPluginStart()
  136. {
  137.     char sEngine[24];
  138.     GetGameFolderName(sEngine, sizeof(sEngine));
  139.     if (StrEqual(sEngine, "left4dead2", false))
  140.         IsLeft4Dead2 = true;
  141.    
  142.     RegAdminCmd("sm_ac130", CallAirdrop, ADMFLAG_ROOT);
  143.     //HookEvent("tank_spawn", EventTank);
  144.     HookEvent("tank_killed", EventTank);
  145.    
  146.     cUseString =        CreateConVar("airdrop_open_string",     "Hehe boi", "Что будет написано при открытии ящика", FCVAR_NONE);
  147.     cTimeOpen =         CreateConVar("airdrop_open_time",       "2.5", "Время открытия", FCVAR_NONE);
  148.     cCountAirdrops =    CreateConVar("airdrop_count_airdrops",  "3", "Кол-во ящиков", FCVAR_NONE);
  149.     cCountItems =       CreateConVar("airdrop_count_items",     "6", "Кол-во предметов из ящиков", FCVAR_NONE);
  150.     cDropType =         CreateConVar("airdrop_type_drop",       "1", "Разные предметы будут выпадать либо нет(Ставить 1, только если квар \"airdrop count items\" > 1)", FCVAR_NONE);
  151.     cTankChance =       CreateConVar("airdrop_tank_chance",     "50", "Шанс аирдропа при смерти танка", FCVAR_NONE);
  152.     AutoExecConfig(true, "Airdrop");
  153. }
  154.  
  155. public Action EventTank(Event event, const char[] name, bool dontbroadcast)
  156. {
  157.     if(GetRandomInt(0, 100) <= GetConVarInt(cTankChance))
  158.     {
  159.         int client = GetClientOfUserId(event.GetInt("userid"));
  160.         AirPlane(client);
  161.     }
  162. }
  163.  
  164. public void OnMapStart()
  165. {
  166.     PrecacheSound(SOUND_PASS1, true);
  167.     for (int i = 0; i < 3; i++)
  168.     {
  169.         PrecacheModel(gModeList[i], true);
  170.     }
  171.     for (int i = 0; i < MAXLIST - 1; i++)
  172.     {
  173.         PrecacheModel(gModelsItemsList[i], true);
  174.     }
  175. }
  176.  
  177. public Action CallAirdrop(int client, int args)
  178. {
  179.     AirPlane(client);
  180.     PrintToChatAll("\x04[Air] \x03%N \x04вызвал аирдроп", client);
  181. }
  182.  
  183. stock void AirPlane(int client)
  184. {
  185.     float vPos[3], vAng[3], direction;
  186.     GetEntPropVector(client, Prop_Send, "m_vecOrigin", vPos);
  187.     vPos[2] += 64;
  188.     GetEntPropVector(client, Prop_Send, "m_angRotation", vAng);
  189.     direction = vAng[1];
  190.            
  191.     float vSkybox[3];
  192.     vAng[0] = 0.0;
  193.     vAng[1] = direction;
  194.     vAng[2] = 0.0;
  195.    
  196.     GetEntPropVector(0, Prop_Data, "m_WorldMaxs", vSkybox);
  197.  
  198.     int entity = CreateEntityByName("prop_dynamic_override");
  199.     DispatchKeyValue(entity, "targetname", "ac130");
  200.     DispatchKeyValue(entity, "disableshadows", "1");
  201.     DispatchKeyValue(entity, "model", gModeList[0]);
  202.     DispatchSpawn(entity);
  203.     float height = vPos[2] + 1150.0;
  204.     if( height > vSkybox[2] - 200 )
  205.         vPos[2] = vSkybox[2] - 200;
  206.     else
  207.         vPos[2] = height;
  208.  
  209.     TeleportEntity(entity, vPos, vAng, NULL_VECTOR);
  210.     EmitSoundToAll(SOUND_PASS1, entity, SNDCHAN_AUTO, SNDLEVEL_HELICOPTER);
  211.     SetVariantString("airport_intro_flyby");
  212.     AcceptEntityInput(entity, "SetAnimation");
  213.     AcceptEntityInput(entity, "Enable");
  214.  
  215.     SetVariantString("OnUser1 !self:Kill::20.20.0:1");
  216.     AcceptEntityInput(entity, "AddOutput");
  217.     AcceptEntityInput(entity, "FireUser1");
  218.     CreateTimer(7.0, TimerDropAirDrop, EntIndexToEntRef(entity));
  219. }
  220.  
  221. public Action TimerDropAirDrop(Handle timer, any entity)
  222. {
  223.     entity = EntRefToEntIndex(entity);
  224.     if(entity != INVALID_ENT_REFERENCE)
  225.     {
  226.         float vPos[3];
  227.         GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vPos);
  228.         CreateCrates(vPos);
  229.     }
  230. }
  231.  
  232. void CreateCrates(float vPos[3])
  233. {
  234.     char sUseString[16], sTimeOpen[16];
  235.     int entity;
  236.     GetConVarString(cUseString, sUseString, sizeof sUseString);
  237.     GetConVarString(cTimeOpen, sTimeOpen, sizeof sTimeOpen);
  238.    
  239.     for(int i = 0; i < GetConVarInt(cCountAirdrops); i++)
  240.     {
  241.         entity = CreateEntityByName("prop_physics_override");
  242.         DispatchKeyValue(entity, "targetname", "SupplyDrop");
  243.         DispatchKeyValueVector(entity, "origin", vPos);
  244.         if(IsLeft4Dead2)
  245.             SetEntityModel(entity, gModeList[1]);
  246.         else
  247.         {
  248.             DispatchKeyValue(entity, "StartGlowing", "1");
  249.             DispatchKeyValue(entity, "model", gModeList[3]);
  250.         }
  251.         DispatchSpawn(entity);
  252.        
  253.         if(IsLeft4Dead2)
  254.         {
  255.             int iTrigger = CreateEntityByName("func_button_timed");
  256.             DispatchKeyValueVector(iTrigger, "origin", vPos);
  257.             DispatchKeyValue(iTrigger, "use_string", sUseString);
  258.             DispatchKeyValue(iTrigger, "use_time", sTimeOpen);
  259.             DispatchKeyValue(iTrigger, "auto_disable", "1");
  260.             DispatchSpawn(iTrigger);
  261.             ActivateEntity(iTrigger);
  262.            
  263.             SetEntPropVector(iTrigger, Prop_Send, "m_vecMins", view_as<float>({-75.0, -75.0, -75.0}));
  264.             SetEntPropVector(iTrigger, Prop_Send, "m_vecMaxs", view_as<float>({75.0, 75.0, 75.0}));
  265.             HookSingleEntityOutput(iTrigger, "OnTimeUp", OnTimeUp);
  266.             SetEntityModel(iTrigger, gModeList[2]);
  267.             SetEntityRenderMode(iTrigger, RENDER_NONE);
  268.             SetVariantString("!activator");
  269.             AcceptEntityInput(iTrigger, "SetParent", entity);
  270.             char sColor[16];
  271.             Format(sColor, sizeof sColor, "255 255 255");
  272.             SetEntProp(entity, Prop_Send, "m_nGlowRange", 500);
  273.             SetEntProp(entity, Prop_Send, "m_iGlowType", 3);
  274.             SetEntProp(entity, Prop_Send, "m_glowColorOverride", GetColor(sColor));
  275.             SetEntProp(iTrigger, Prop_Data, "m_takedamage", 0, 1);
  276.             SetEntProp(entity, Prop_Data, "m_takedamage", 0, 1);
  277.             gIndexCrate[iTrigger] = EntIndexToEntRef(entity);
  278.         }
  279.         else SDKHook(entity, SDKHook_OnTakeDamage, OnTakeDamage);
  280.     }
  281.     //SDKHook(entity, SDKHook_OnTakeDamage, OnTakeDamage);
  282.     PrintToChatAll("\x04[Air] \x03Аирдроп(ы) \x04упал(и) в примерных координатах \x05%.2f %.2f %.2f", vPos[0], vPos[1], vPos[2]);
  283. }
  284.  
  285. public void OnTimeUp(const char[] output, int caller, int activator, float delay)
  286. {
  287.     if (activator > 0 && IsClientInGame(activator))
  288.     {
  289.         int entity = gIndexCrate[caller];
  290.         if((entity = EntRefToEntIndex(entity)) != INVALID_ENT_REFERENCE)
  291.         {
  292.             int SupplyItem;
  293.             float vPos[3], vAng[3];
  294.             AcceptEntityInput(caller, "kill");
  295.             GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vPos);
  296.             GetEntPropVector(entity, Prop_Send, "m_angRotation", vAng);
  297.             int OpenedCrate = CreateEntityByName("prop_physics_override");
  298.             DispatchKeyValueVector(OpenedCrate, "origin", vPos);
  299.             DispatchKeyValueVector(OpenedCrate, "angles", vAng);
  300.             SetEntityModel(OpenedCrate, gModeList[2]);
  301.             DispatchSpawn(OpenedCrate);
  302.             int RandomIntType = GetRandomInt(0, 24);
  303.             AcceptEntityInput(entity, "kill");
  304.             for(int i = 0; i <= GetConVarInt(cCountItems); i++)
  305.             {
  306.                 if(GetConVarInt(cDropType) != 1) SupplyItem = CreateEntityByName(gItemsList[RandomIntType]);
  307.                 else
  308.                 {
  309.                     if(IsLeft4Dead2) RandomIntType = GetRandomInt(0, 24);
  310.                     else RandomIntType = GetRandomInt(0, 8);
  311.                     SupplyItem = CreateEntityByName(gItemsList[RandomIntType]);
  312.                 }
  313.                 if(IsValidEntity(SupplyItem))
  314.                 {
  315.                     DispatchSpawn(SupplyItem);
  316.                     SetEntityModel(SupplyItem, gModelsItemsList[RandomIntType]);
  317.                     vPos[2] += 2.5;
  318.                     vAng[0] = 0.0;
  319.                     vAng[1] = 90.0;
  320.                     vAng[2] = 0.0;
  321.                     TeleportEntity(SupplyItem, vPos, vAng, NULL_VECTOR);
  322.                     if(gAmmoList[RandomIntType] != -1)
  323.                         SetEntProp(SupplyItem, Prop_Send, "m_iExtraPrimaryAmmo", gAmmoList[RandomIntType], 4);
  324.                 }
  325.             }
  326.             PrintToChatAll("\x04[Air] \x03%N \x04открыл аирдроп", activator);
  327.         }
  328.     }
  329. }
  330.  
  331. public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype)  
  332. {
  333.     if(IsValidEntity(victim) && attacker > 0 && GetClientTeam(attacker) == 2)
  334.     {
  335.         float vPos[3];
  336.         char sModel[126];
  337.         int SupplyItem;
  338.         GetEntPropString(victim, Prop_Data, "m_ModelName", sModel, sizeof(sModel));
  339.         if(strcmp(sModel, gModeList[3]) == 0)
  340.         {  
  341.             AcceptEntityInput(victim, "break");
  342.            
  343.             GetEntPropVector(victim, Prop_Send, "m_vecOrigin", vPos);
  344.             for(int v = 0; v < GetConVarInt(cCountItems); v++)
  345.             {
  346.                 PrintToChatAll("3");
  347.                 int iInt = GetRandomInt(0, 7);
  348.                 PrintToChatAll("1");
  349.                 if(GetConVarInt(cDropType) == 1) SupplyItem = CreateEntityByName(gItemsListL4D1[GetRandomInt(0, 7)]);
  350.                 else CreateEntityByName(gItemsListL4D1[iInt]);
  351.                 PrintToChatAll("2");
  352.                 DispatchSpawn(SupplyItem);
  353.                 vPos[2] += 5.0;
  354.                 TeleportEntity(SupplyItem, vPos, NULL_VECTOR, NULL_VECTOR);
  355.             }
  356.             PrintToChatAll("\x04[Air] \x03%N \x04вскрыл аирдроп", attacker);
  357.         }
  358.     }
  359. }
  360.  
  361. int GetColor(char[] sTemp)
  362. {
  363.     if( StrEqual(sTemp, "") )
  364.         return 0;
  365.  
  366.     char sColors[3][4];
  367.     int color = ExplodeString(sTemp, " ", sColors, 3, 4);
  368.  
  369.     if( color != 3 )
  370.         return 0;
  371.  
  372.     color = StringToInt(sColors[0]);
  373.     color += 256 * StringToInt(sColors[1]);
  374.     color += 65536 * StringToInt(sColors[2]);
  375.  
  376.     return color;
  377. }
Advertisement
Add Comment
Please, Sign In to add comment