FlacoBey

Untitled

Jan 8th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.77 KB | None | 0 0
  1.  #include <sourcemod>
  2. #include <sdktools>
  3. #include <sdkhooks>
  4.  
  5. #pragma semicolon 1.0
  6.  
  7. #define ZOMBIECLASS_SMOKER    1
  8. #define ZOMBIECLASS_BOOMER    2
  9. #define ZOMBIECLASS_HUNTER    3
  10. #define ZOMBIECLASS_SPITTER   4
  11. #define ZOMBIECLASS_JOCKEY    5
  12. #define ZOMBIECLASS_CHARGER   6
  13. #define ZOMBIECLASS_WITCH     7
  14. #define ZOMBIECLASS_TANK      8
  15.  
  16. char Message[32];
  17. HintIndex[2048+1];
  18. HintEntity[2048+1];
  19.  
  20. new bool:lateLoad;
  21. char sDataFilePath[PLATFORM_MAX_PATH];
  22. public APLRes:AskPluginLoad2(Handle:plugin, bool:late, String:error[], errMax)
  23. {
  24.     lateLoad = late;
  25.     return APLRes_Success;    
  26. }
  27.  
  28. public OnPluginStart()
  29. {
  30.     if (lateLoad)
  31.     {
  32.         for (new client = 1; client <= MaxClients; client++)
  33.         {
  34.             if (IsClientInGame(client))
  35.             {
  36.                 OnClientPutInServer(client);
  37.             }
  38.         }
  39.     }
  40.     BuildPath(Path_SM, sDataFilePath, sizeof(sDataFilePath), "data/melee_damage_specials.ini");
  41.     if (!FileExists(sDataFilePath))
  42.     {
  43.         new Handle:open_path = OpenFile(sDataFilePath, "w");
  44.         WriteFileLine(open_path, "");
  45.         CloseHandle(open_path);
  46.         PrintToServer("Error Code: WSP-EC-01.0A");
  47.         KvWriteToFile(sDataFilePath);
  48.     }
  49.     HookEvent("player_spawn", ePlayerSpawn);
  50.     HookEvent("player_death", ePlayerDeath, EventHookMode_Pre);
  51. }
  52.  
  53. public void ePlayerSpawn(Event event, const char[] name, bool dontBroadcast)
  54. {
  55.     int special = GetClientOfUserId(GetEventInt(event, "userid"));
  56.  
  57.     if (IsValidClient(special) && GetClientTeam(special) == 3)
  58.         CreateHintEntity(special);
  59. }
  60.  
  61. public void ePlayerDeath(Event event, const char[] name, bool dontBroadcast)
  62. {
  63.     int special = GetClientOfUserId(GetEventInt(event, "userid"));
  64.  
  65.     if (IsValidClient(special) && GetClientTeam(special) == 3)
  66.         DestroyHintEntity(special);
  67. }
  68.  
  69. void KvWriteToFile(const char[] path)
  70. {
  71.     KeyValues kv = new KeyValues("damage_melee");
  72.    
  73.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_baseball_bat/damage", 1.0);
  74.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_cricket_bat/damage", 1.0);
  75.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_crowbar/damage", 1.0);
  76.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_electric_guitar/damage", 1.0);
  77.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_fireaxe/damage", 1.0);
  78.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_frying_pan/damage", 1.0);
  79.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_golfclub/damage", 1.0);
  80.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_katana/damage", 1.0);
  81.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_machete/damage", 1.0);
  82.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_tonfa/damage", 1.0);
  83.     kv.SetFloat("ZOMBIECLASS_SMOKER/weapon_knife/damage", 1.0);
  84.    
  85.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_baseball_bat/damage", 1.0);
  86.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_cricket_bat/damage", 1.0);
  87.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_crowbar/damage", 1.0);
  88.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_electric_guitar/damage", 1.0);
  89.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_fireaxe/damage", 1.0);
  90.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_frying_pan/damage", 1.0);
  91.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_golfclub/damage", 1.0);
  92.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_katana/damage", 1.0);
  93.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_machete/damage", 1.0);
  94.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_tonfa/damage", 1.0);
  95.     kv.SetFloat("ZOMBIECLASS_BOOMER/weapon_knife/damage", 1.0);
  96.    
  97.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_baseball_bat/damage", 1.0);
  98.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_cricket_bat/damage", 1.0);
  99.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_crowbar/damage", 1.0);
  100.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_electric_guitar/damage", 1.0);
  101.     kv.SetFloat("ZOMBIECLASS_HUNTER/fireaxe/damage", 1.0);
  102.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_frying_pan/damage", 1.0);
  103.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_golfclub/damage", 1.0);
  104.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_katana/damage", 1.0);
  105.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_machete/damage", 1.0);
  106.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_tonfa/damage", 1.0);
  107.     kv.SetFloat("ZOMBIECLASS_HUNTER/weapon_knife/damage", 1.0);
  108.    
  109.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_baseball_bat/damage", 1.0);
  110.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_cricket_bat/damage", 1.0);
  111.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_crowbar/damage", 1.0);
  112.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_electric_guitar/damage", 1.0);
  113.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_fireaxe/damage", 1.0);
  114.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_frying_pan/damage", 1.0);
  115.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_golfclub/damage", 1.0);
  116.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_katana/damage", 1.0);
  117.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_machete/damage", 1.0);
  118.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_tonfa/damage", 1.0);
  119.     kv.SetFloat("ZOMBIECLASS_SPITTER/weapon_knife/damage", 1.0);
  120.    
  121.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_baseball_bat/damage", 1.0);
  122.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_cricket_bat/damage", 1.0);
  123.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_crowbar/damage", 1.0);
  124.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_electric_guitar/damage", 1.0);
  125.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_fireaxe/damage", 1.0);
  126.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_frying_pan/damage", 1.0);
  127.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_golfclub/damage", 1.0);
  128.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_katana/damage", 1.0);
  129.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_machete/damage", 1.0);
  130.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_tonfa/damage", 1.0);
  131.     kv.SetFloat("ZOMBIECLASS_JOCKEY/weapon_knife/damage", 1.0);
  132.    
  133.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_baseball_bat/damage", 1.0);
  134.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_cricket_bat/damage", 1.0);
  135.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_crowbar/damage", 1.0);
  136.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_electric_guitar/damage", 1.0);
  137.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_fireaxe/damage", 1.0);
  138.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_frying_pan/damage", 1.0);
  139.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_golfclub/damage", 1.0);
  140.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_katana/damage", 1.0);
  141.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_machete/damage", 1.0);
  142.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_tonfa/damage", 1.0);
  143.     kv.SetFloat("ZOMBIECLASS_CHARGER/weapon_knife/damage", 1.0);
  144.    
  145.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_baseball_bat/damage", 1.0);
  146.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_cricket_bat/damage", 1.0);
  147.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_crowbar/damage", 1.0);
  148.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_electric_guitar/damage", 1.0);
  149.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_fireaxe/damage", 1.0);
  150.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_frying_pan/damage", 1.0);
  151.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_golfclub/damage", 1.0);
  152.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_katana/damage", 1.0);
  153.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_machete/damage", 1.0);
  154.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_tonfa/damage", 1.0);
  155.     kv.SetFloat(" ZOMBIECLASS_TANK/weapon_knife/damage", 1.0);
  156.  
  157.     kv.ExportToFile(path);
  158.  
  159.     delete kv;
  160. }
  161.  
  162. public OnClientPutInServer(client)
  163. {
  164.     SDKHook(client, SDKHook_TraceAttack, _SI_OnTraceAttack);
  165. }
  166.  
  167. public OnClientDisconnect(client)
  168. {
  169.     SDKUnhook(client, SDKHook_TraceAttack, _SI_OnTraceAttack);
  170. }
  171.  
  172. public Action:_SI_OnTraceAttack(victim, &attacker, &inflictor, &Float:damage, &damagetype, &ammotype, hitbox, hitgroup)
  173. {
  174.     decl String:weaponname[64];
  175.     GetClientWeapon(attacker, weaponname, sizeof(weaponname));
  176.     if (StrEqual(weaponname, "weapon_melee"))
  177.     {
  178.         GetEntPropString(GetPlayerWeaponSlot(attacker, 1), Prop_Data, "m_strMapSetScriptName", weaponname, sizeof(weaponname));
  179.         KeyValues kv = new KeyValues("damage_melee");
  180.         if (kv.ImportFromFile(sDataFilePath))
  181.         {
  182.             int health = GetEntProp(victim, Prop_Send, "m_iHealth");
  183.             Format(Message, sizeof(Message), "%d", health);
  184.             Format(weaponname, sizeof(weaponname), "weapon_%s", weaponname);
  185.             if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 1)
  186.             {
  187.                 if (KvJumpToKey(kv, "ZOMBIECLASS_SMOKER", true))
  188.                 {
  189.                     if (KvJumpToKey(kv, weaponname, true))
  190.                     {
  191.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  192.                         float num = KvGetFloat(kv, "damage", 1.0);
  193.                         int heal = GetClientHealth(victim);
  194.                         PrintToChatAll("Smoker=%i", heal);
  195.                         damage = num;
  196.                         return Plugin_Changed;
  197.                     }
  198.                 }
  199.             }
  200.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 2)
  201.             {
  202.                 if (KvJumpToKey(kv, "ZOMBIECLASS_BOOMER", true))
  203.                 {
  204.                     if (KvJumpToKey(kv, weaponname, true))
  205.                     {
  206.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  207.                         float num = KvGetFloat(kv, "damage", 1.0);
  208.                         int heal = GetClientHealth(victim);
  209.                         PrintToChatAll("Boomer=%i", heal);
  210.                         damage = num;
  211.                         return Plugin_Changed;
  212.                     }
  213.                 }
  214.             }
  215.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 3)
  216.             {
  217.                 if (KvJumpToKey(kv, "ZOMBIECLASS_HUNTER", true))
  218.                 {
  219.                     if (KvJumpToKey(kv, weaponname, true))
  220.                     {
  221.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  222.                         float num = KvGetFloat(kv, "damage", 1.0);
  223.                         int heal = GetClientHealth(victim);
  224.                         PrintToChatAll("Hunter=%i", heal);
  225.                         PrintToChatAll("%s", weaponname);
  226.                         damage = num;
  227.                         return Plugin_Changed;
  228.                     }
  229.                 }
  230.             }
  231.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 4)
  232.             {
  233.                 if (KvJumpToKey(kv, "ZOMBIECLASS_SPITTER", true))
  234.                 {
  235.                     if (KvJumpToKey(kv, weaponname, true))
  236.                     {
  237.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  238.                         float num = KvGetFloat(kv, "damage", 1.0);
  239.                         int heal = GetClientHealth(victim);
  240.                         PrintToChatAll("Spitterr=%i", heal);
  241.                         damage = num;
  242.                         return Plugin_Changed;
  243.                     }
  244.                 }
  245.             }
  246.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 5)
  247.             {
  248.                 if (KvJumpToKey(kv, "ZOMBIECLASS_JOCKEY", true))
  249.                 {
  250.                     if (KvJumpToKey(kv, weaponname, true))
  251.                     {
  252.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  253.                         float num = KvGetFloat(kv, "damage", 1.0);
  254.                         int heal = GetClientHealth(victim);
  255.                         PrintToChatAll("Jockey=%i", heal);
  256.                         damage = num;
  257.                         return Plugin_Changed;
  258.                     }
  259.                 }
  260.             }
  261.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 6)
  262.             {
  263.                 if (KvJumpToKey(kv, "ZOMBIECLASS_CHARGER", true))
  264.                 {
  265.                     if (KvJumpToKey(kv, weaponname, true))
  266.                     {
  267.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  268.                         float num = KvGetFloat(kv, "damage", 1.0);
  269.                         int heal = GetClientHealth(victim);
  270.                         PrintToChatAll("Charger=%i", heal);
  271.                         damage = num;
  272.                         return Plugin_Changed;
  273.                     }
  274.                 }
  275.             }
  276.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 8)
  277.             {
  278.                 if (KvJumpToKey(kv, "ZOMBIECLASS_TANK", true))
  279.                 {
  280.                     if (KvJumpToKey(kv, weaponname, true))
  281.                     {
  282.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  283.                         float num = KvGetFloat(kv, "damage", 1.0);
  284.                         int heal = GetClientHealth(victim);
  285.                         PrintToChatAll("Tank=%i", heal);
  286.                         damage =  num;
  287.                         return Plugin_Changed;
  288.                     }
  289.                 }
  290.             }
  291.         }
  292.     }
  293.     return Plugin_Stop;
  294. }
  295.  
  296. stock void DisplayInstructorHint(int target, float fTime, float fHeight, float fRange, bool bFollow, bool bShowOffScreen, char[] sIconOnScreen, char[] sIconOffScreen, char[] sCmd, bool bShowTextAlways, int iColor[3], char sText[32])
  297. {
  298.     char sBuffer[32];
  299.  
  300.     FormatEx(sBuffer, sizeof(sBuffer), "si_%d", target);
  301.     DispatchKeyValue(target, "targetname", sBuffer);
  302.     DispatchKeyValue(HintEntity[target], "hint_target", sBuffer);
  303.     DispatchKeyValue(HintEntity[target], "hint_name", sBuffer);
  304.     DispatchKeyValue(HintEntity[target], "hint_replace_key", sBuffer);
  305.  
  306.     FormatEx(sBuffer, sizeof(sBuffer), "%d", !bFollow);
  307.     DispatchKeyValue(HintEntity[target], "hint_static", sBuffer);
  308.     DispatchKeyValue(HintEntity[target], "hint_timeout", "0.0");
  309.  
  310.     FormatEx(sBuffer, sizeof(sBuffer), "%d", RoundToFloor(fHeight));
  311.     DispatchKeyValue(HintEntity[target], "hint_icon_offset", sBuffer);
  312.  
  313.     FormatEx(sBuffer, sizeof(sBuffer), "%d", RoundToFloor(fRange));
  314.     DispatchKeyValue(HintEntity[target], "hint_range", sBuffer);
  315.  
  316.     FormatEx(sBuffer, sizeof(sBuffer), "%d", !bShowOffScreen);
  317.     DispatchKeyValue(HintEntity[target], "hint_nooffscreen", sBuffer);
  318.  
  319.     DispatchKeyValue(HintEntity[target], "hint_icon_onscreen", sIconOnScreen);
  320.     DispatchKeyValue(HintEntity[target], "hint_icon_offscreen", sIconOffScreen);
  321.  
  322.     DispatchKeyValue(HintEntity[target], "hint_binding", sCmd);
  323.  
  324.     // Shows text behind walls (false limits distance of seeing hint)
  325.     FormatEx(sBuffer, sizeof(sBuffer), "%d", bShowTextAlways);
  326.     DispatchKeyValue(HintEntity[target], "hint_forcecaption", sBuffer);
  327.  
  328.     FormatEx(sBuffer, sizeof(sBuffer), "%d %d %d", iColor[0], iColor[1], iColor[2]);
  329.     DispatchKeyValue(HintEntity[target], "hint_color", sBuffer);
  330.  
  331.     //ReplaceString(sText, sizeof(sText), "\n", " ");
  332.     DispatchKeyValue(HintEntity[target], "hint_caption", sText);
  333.     DispatchKeyValue(HintEntity[target], "hint_activator_caption", sText);
  334.  
  335.     DispatchKeyValue(HintEntity[target], "hint_flags", "0");
  336.     DispatchKeyValue(HintEntity[target], "hint_display_limit", "0");
  337.     DispatchKeyValue(HintEntity[target], "hint_suppress_rest", "1");
  338.     DispatchKeyValue(HintEntity[target], "hint_instance_type", "2");
  339.     DispatchKeyValue(HintEntity[target], "hint_auto_start", "false"); //true
  340.     DispatchKeyValue(HintEntity[target], "hint_local_player_only", "true");
  341.     DispatchKeyValue(HintEntity[target], "hint_allow_nodraw_target", "true");
  342.  
  343.     //DispatchKeyValue(HintEntity[target], "hint_pulseoption", "1");
  344.     //DispatchKeyValue(HintEntity[target], "hint_alphaoption", "1");
  345.     //DispatchKeyValue(HintEntity[target], "hint_shakeoption", "1");
  346.  
  347.     DispatchSpawn(HintEntity[target]);
  348.     AcceptEntityInput(HintEntity[target], "ShowHint");
  349.  
  350.     HintIndex[target] = EntIndexToEntRef(HintEntity[target]);
  351. }
  352.  
  353. void DestroyHintEntity(int client)
  354. {
  355.     if(IsValidEntRef(HintIndex[client]))
  356.     {
  357.         AcceptEntityInput(HintIndex[client], "Kill");
  358.         HintIndex[client] = -1;
  359.     }
  360. }
  361.  
  362. void CreateHintEntity(int client)
  363. {
  364.     if(IsValidEntRef(HintIndex[client]))
  365.     {
  366.         AcceptEntityInput(HintIndex[client], "Kill");
  367.         HintIndex[client] = -1;
  368.     }
  369.  
  370.     HintEntity[client] = CreateEntityByName("env_instructor_hint");
  371.  
  372.     if(HintEntity[client] < 0)
  373.         return;
  374.  
  375.     DispatchSpawn(HintEntity[client]);
  376.  
  377.     HintIndex[client] = EntIndexToEntRef(HintEntity[client]);
  378. }
  379.  
  380. stock bool IsValidClient(int client)
  381. {
  382.     return (client > 0 && client <= MaxClients && IsClientInGame(client));
  383. }
  384.  
  385. stock bool IsIncapped(int client)
  386. {
  387.     return (GetEntProp(client, Prop_Send, "m_isIncapacitated", 1) > 0);
  388. }
  389.  
  390. static bool IsValidEntRef(int iEntRef)
  391. {
  392.     static int iEntity;
  393.     iEntity = EntRefToEntIndex(iEntRef);
  394.     return (iEntRef && iEntity != INVALID_ENT_REFERENCE && IsValidEntity(iEntity));
  395. }
Advertisement
Add Comment
Please, Sign In to add comment