FlacoBey

Untitled

Jan 8th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.15 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.                         damage = num;
  194.                         return Plugin_Changed;
  195.                     }
  196.                 }
  197.             }
  198.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 2)
  199.             {
  200.                 if (KvJumpToKey(kv, "ZOMBIECLASS_BOOMER", true))
  201.                 {
  202.                     if (KvJumpToKey(kv, weaponname, true))
  203.                     {
  204.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  205.                         float num = KvGetFloat(kv, "damage", 1.0);
  206.                         damage = num;
  207.                         return Plugin_Changed;
  208.                     }
  209.                 }
  210.             }
  211.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 3)
  212.             {
  213.                 if (KvJumpToKey(kv, "ZOMBIECLASS_HUNTER", true))
  214.                 {
  215.                     if (KvJumpToKey(kv, weaponname, true))
  216.                     {
  217.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  218.                         float num = KvGetFloat(kv, "damage", 1.0);
  219.                         damage = num;
  220.                         return Plugin_Changed;
  221.                     }
  222.                 }
  223.             }
  224.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 4)
  225.             {
  226.                 if (KvJumpToKey(kv, "ZOMBIECLASS_SPITTER", true))
  227.                 {
  228.                     if (KvJumpToKey(kv, weaponname, true))
  229.                     {
  230.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  231.                         float num = KvGetFloat(kv, "damage", 1.0);
  232.                         damage = num;
  233.                         return Plugin_Changed;
  234.                     }
  235.                 }
  236.             }
  237.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 5)
  238.             {
  239.                 if (KvJumpToKey(kv, "ZOMBIECLASS_JOCKEY", true))
  240.                 {
  241.                     if (KvJumpToKey(kv, weaponname, true))
  242.                     {
  243.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  244.                         float num = KvGetFloat(kv, "damage", 1.0);
  245.                         damage = num;
  246.                         return Plugin_Changed;
  247.                     }
  248.                 }
  249.             }
  250.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 6)
  251.             {
  252.                 if (KvJumpToKey(kv, "ZOMBIECLASS_CHARGER", true))
  253.                 {
  254.                     if (KvJumpToKey(kv, weaponname, true))
  255.                     {
  256.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  257.                         float num = KvGetFloat(kv, "damage", 1.0);
  258.                         damage = num;
  259.                         return Plugin_Changed;
  260.                     }
  261.                 }
  262.             }
  263.             else if(GetEntProp(victim, Prop_Send, "m_zombieClass") == 8)
  264.             {
  265.                 if (KvJumpToKey(kv, "ZOMBIECLASS_TANK", true))
  266.                 {
  267.                     if (KvJumpToKey(kv, weaponname, true))
  268.                     {
  269.                         DisplayInstructorHint(victim, 0.0, 0.0, 0.0, true, false, "", "", "", false, {255, 255, 0}, Message);
  270.                         float num = KvGetFloat(kv, "damage", 1.0);
  271.                         damage =  num;
  272.                         return Plugin_Changed;
  273.                     }
  274.                 }
  275.             }
  276.         }
  277.     }
  278.     return Plugin_Stop;
  279. }
  280.  
  281. 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])
  282. {
  283.     char sBuffer[32];
  284.  
  285.     FormatEx(sBuffer, sizeof(sBuffer), "si_%d", target);
  286.     DispatchKeyValue(target, "targetname", sBuffer);
  287.     DispatchKeyValue(HintEntity[target], "hint_target", sBuffer);
  288.     DispatchKeyValue(HintEntity[target], "hint_name", sBuffer);
  289.     DispatchKeyValue(HintEntity[target], "hint_replace_key", sBuffer);
  290.  
  291.     FormatEx(sBuffer, sizeof(sBuffer), "%d", !bFollow);
  292.     DispatchKeyValue(HintEntity[target], "hint_static", sBuffer);
  293.     DispatchKeyValue(HintEntity[target], "hint_timeout", "0.0");
  294.  
  295.     FormatEx(sBuffer, sizeof(sBuffer), "%d", RoundToFloor(fHeight));
  296.     DispatchKeyValue(HintEntity[target], "hint_icon_offset", sBuffer);
  297.  
  298.     FormatEx(sBuffer, sizeof(sBuffer), "%d", RoundToFloor(fRange));
  299.     DispatchKeyValue(HintEntity[target], "hint_range", sBuffer);
  300.  
  301.     FormatEx(sBuffer, sizeof(sBuffer), "%d", !bShowOffScreen);
  302.     DispatchKeyValue(HintEntity[target], "hint_nooffscreen", sBuffer);
  303.  
  304.     DispatchKeyValue(HintEntity[target], "hint_icon_onscreen", sIconOnScreen);
  305.     DispatchKeyValue(HintEntity[target], "hint_icon_offscreen", sIconOffScreen);
  306.  
  307.     DispatchKeyValue(HintEntity[target], "hint_binding", sCmd);
  308.  
  309.     // Shows text behind walls (false limits distance of seeing hint)
  310.     FormatEx(sBuffer, sizeof(sBuffer), "%d", bShowTextAlways);
  311.     DispatchKeyValue(HintEntity[target], "hint_forcecaption", sBuffer);
  312.  
  313.     FormatEx(sBuffer, sizeof(sBuffer), "%d %d %d", iColor[0], iColor[1], iColor[2]);
  314.     DispatchKeyValue(HintEntity[target], "hint_color", sBuffer);
  315.  
  316.     //ReplaceString(sText, sizeof(sText), "\n", " ");
  317.     DispatchKeyValue(HintEntity[target], "hint_caption", sText);
  318.     DispatchKeyValue(HintEntity[target], "hint_activator_caption", sText);
  319.  
  320.     DispatchKeyValue(HintEntity[target], "hint_flags", "0");
  321.     DispatchKeyValue(HintEntity[target], "hint_display_limit", "0");
  322.     DispatchKeyValue(HintEntity[target], "hint_suppress_rest", "1");
  323.     DispatchKeyValue(HintEntity[target], "hint_instance_type", "2");
  324.     DispatchKeyValue(HintEntity[target], "hint_auto_start", "false"); //true
  325.     DispatchKeyValue(HintEntity[target], "hint_local_player_only", "true");
  326.     DispatchKeyValue(HintEntity[target], "hint_allow_nodraw_target", "true");
  327.  
  328.     //DispatchKeyValue(HintEntity[target], "hint_pulseoption", "1");
  329.     //DispatchKeyValue(HintEntity[target], "hint_alphaoption", "1");
  330.     //DispatchKeyValue(HintEntity[target], "hint_shakeoption", "1");
  331.  
  332.     DispatchSpawn(HintEntity[target]);
  333.     AcceptEntityInput(HintEntity[target], "ShowHint");
  334.  
  335.     HintIndex[target] = EntIndexToEntRef(HintEntity[target]);
  336. }
  337.  
  338. void DestroyHintEntity(int client)
  339. {
  340.     if(IsValidEntRef(HintIndex[client]))
  341.     {
  342.         AcceptEntityInput(HintIndex[client], "Kill");
  343.         HintIndex[client] = -1;
  344.     }
  345. }
  346.  
  347. void CreateHintEntity(int client)
  348. {
  349.     if(IsValidEntRef(HintIndex[client]))
  350.     {
  351.         AcceptEntityInput(HintIndex[client], "Kill");
  352.         HintIndex[client] = -1;
  353.     }
  354.  
  355.     HintEntity[client] = CreateEntityByName("env_instructor_hint");
  356.  
  357.     if(HintEntity[client] < 0)
  358.         return;
  359.  
  360.     DispatchSpawn(HintEntity[client]);
  361.  
  362.     HintIndex[client] = EntIndexToEntRef(HintEntity[client]);
  363. }
  364.  
  365. stock bool IsValidClient(int client)
  366. {
  367.     return (client > 0 && client <= MaxClients && IsClientInGame(client));
  368. }
  369.  
  370. stock bool IsIncapped(int client)
  371. {
  372.     return (GetEntProp(client, Prop_Send, "m_isIncapacitated", 1) > 0);
  373. }
  374.  
  375. static bool IsValidEntRef(int iEntRef)
  376. {
  377.     static int iEntity;
  378.     iEntity = EntRefToEntIndex(iEntRef);
  379.     return (iEntRef && iEntity != INVALID_ENT_REFERENCE && IsValidEntity(iEntity));
  380. }
Advertisement
Add Comment
Please, Sign In to add comment