Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sourcemod>
- #include <sdktools>
- #define MAXLIST 11
- #pragma newdecls required
- #pragma semicolon 1
- static bool ignoreNextDamageDealt[MAXPLAYERS+1] = false;
- static const char gModelsItemsList[MAXLIST][] =
- {
- "models/weapons/melee/v_katana.mdl", //0
- "models/weapons/melee/v_fireaxe.mdl", //1
- "models/weapons/melee/v_machete.mdl", //2
- "models/weapons/melee/v_crowbar.mdl", //3
- "models/v_models/v_knife_t.mdl", //4
- "models/weapons/melee/v_frying_pan.mdl", //5
- "models/weapons/melee/v_bat.mdl", //6
- "models/weapons/melee/v_cricket_bat.mdl", //7
- "models/weapons/melee/v_tonfa.mdl", //8
- "models/weapons/melee/v_electric_guitar.mdl", //9
- "models/weapons/melee/v_golfclub.mdl" //10
- };
- static const char gGeneralMelee[MAXLIST - 6][] =
- {
- "katana",
- "fireaxe",
- "machete",
- "crowbar",
- "knife"
- };
- static const float gMeleeModifier[MAXLIST - 5] =
- {
- 1.0,
- 1.0,
- 0.99,
- 0.9,
- 0.7,
- 0.6
- };
- public void OnPluginStart()
- {
- HookEvent("infected_hurt", iInfectedHurt);
- }
- public Action iInfectedHurt(Event event, const char[] name, bool dontBroadcast)
- {
- char weaponname[56];
- int attacker = GetClientOfUserId(event.GetInt("attacker"));
- int entity = event.GetInt("entityid");
- if (!attacker || !IsValidEntity(entity) || ignoreNextDamageDealt[attacker]) return;
- int dmg_health = GetEventInt(event,"amount");
- int eventhealth = GetEntProp(entity, Prop_Data, "m_iHealth");
- int damagedelta;
- int iCurrentWeapon = GetEntPropEnt(attacker, Prop_Send, "m_hActiveWeapon");
- if(!IsValidEntity(iCurrentWeapon)) return;
- GetEntityClassname(iCurrentWeapon, weaponname, sizeof(weaponname));
- if (strcmp(weaponname, "weapon_melee") == 0)
- GetEntPropString(iCurrentWeapon, Prop_Data, "m_strMapSetScriptName", weaponname, sizeof weaponname);
- else return;
- if(weaponname[0] == 0)
- {
- char ModelName[128], sExplodeString[MAXLIST - 6][36];
- int iNum;
- GetEntPropString(iCurrentWeapon, Prop_Data, "m_ModelName", ModelName, sizeof ModelName);
- for(int i; i < MAXLIST; i++)
- {
- if(strcmp(ModelName, gModelsItemsList[i]) == 0)
- {
- iNum = ExplodeString(gModelsItemsList[i], "/", sExplodeString, sizeof sExplodeString, sizeof sExplodeString[]);
- ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "v_", "");
- if(StrContains(sExplodeString[iNum - 1], "knife") > 0)
- ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "_t.mdl", "");
- else
- ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], ".mdl", "");
- TrimString(sExplodeString[iNum - 1]);
- Format(weaponname, sizeof weaponname, "%s", sExplodeString[iNum - 1]);
- break;
- }
- }
- }
- damagedelta = RoundToNearest((dmg_health * gMeleeModifier[5]) - dmg_health);
- for(int i; i < 5; i++)
- {
- if(strcmp(weaponname, gGeneralMelee[i]) == 0)
- {
- damagedelta = RoundToNearest((dmg_health * gMeleeModifier[i]) - dmg_health);
- break;
- }
- }
- if(damagedelta > 0)
- {
- applyDamage(damagedelta, entity, attacker);
- }
- else
- {
- int health = eventhealth - damagedelta;
- if (health < 1)
- {
- damagedelta += (health - 1);
- health = 1;
- }
- SetEntProp(entity, Prop_Data, "m_iHealth", health);
- SetEventInt(event, "amount", damagedelta);
- }
- }
- static void applyDamage(int damage, int victim, int attacker)
- {
- Handle dataPack = CreateDataPack();
- WritePackCell(dataPack, damage);
- WritePackCell(dataPack, victim);
- WritePackCell(dataPack, attacker);
- CreateTimer(0.1, timer_stock_applyDamage, dataPack);
- ignoreNextDamageDealt[attacker] = true;
- CreateTimer(0.2, timer_resetStop, attacker);
- }
- public Action timer_resetStop(Handle timer, any client)
- {
- ignoreNextDamageDealt[client] = false;
- }
- public Action timer_stock_applyDamage(Handle timer, Handle dataPack)
- {
- ResetPack(dataPack);
- int damage = ReadPackCell(dataPack);
- int victim = ReadPackCell(dataPack);
- int attacker = ReadPackCell(dataPack);
- CloseHandle(dataPack);
- float victimPos[3]; char strDamage[16], strDamageTarget[16];
- if (victim < 20 && IsClientInGame(victim))
- {
- GetClientEyePosition(victim, victimPos);
- }
- else if (IsValidEntity(victim))
- {
- GetEntityAbsOrigin(victim, victimPos);
- }
- else return;
- IntToString(damage, strDamage, sizeof(strDamage));
- Format(strDamageTarget, sizeof(strDamageTarget), "hurtme%d", victim);
- int entPointHurt = CreateEntityByName("point_hurt");
- if(!entPointHurt) return;
- DispatchKeyValue(victim, "targetname", strDamageTarget);
- DispatchKeyValue(entPointHurt, "DamageTarget", strDamageTarget);
- DispatchKeyValue(entPointHurt, "Damage", strDamage);
- DispatchKeyValue(entPointHurt, "DamageType", "0");
- DispatchSpawn(entPointHurt);
- TeleportEntity(entPointHurt, victimPos, NULL_VECTOR, NULL_VECTOR);
- AcceptEntityInput(entPointHurt, "Hurt", (attacker && attacker < 20 && IsClientInGame(attacker)) ? attacker : -1);
- DispatchKeyValue(entPointHurt, "classname", "point_hurt");
- DispatchKeyValue(victim, "targetname", "null");
- AcceptEntityInput(entPointHurt, "kill");
- PushCommonInfected(attacker, victim, victimPos);
- }
- stock void GetEntityAbsOrigin( int entity, float origin[3])
- {
- if (entity > 0 && IsValidEntity(entity))
- {
- float mins[3], maxs[3];
- GetEntPropVector(entity,Prop_Send,"m_vecOrigin",origin);
- GetEntPropVector(entity,Prop_Send,"m_vecMins",mins);
- GetEntPropVector(entity,Prop_Send,"m_vecMaxs",maxs);
- origin[0] += (mins[0] + maxs[0]) * 0.5;
- origin[1] += (mins[1] + maxs[1]) * 0.5;
- origin[2] += (mins[2] + maxs[2]) * 0.5;
- }
- }
- void PushCommonInfected(int client, int target, float vPos[3])
- {
- int entity = CreateEntityByName("point_hurt");
- DispatchKeyValue(target, "targetname", "silvershot");
- DispatchKeyValue(entity, "DamageTarget", "silvershot");
- DispatchKeyValue(entity, "Damage", "0");
- DispatchKeyValue(entity, "DamageType", "33554432"); // DMG_AIRBOAT (1<<25)
- TeleportEntity(entity, vPos, NULL_VECTOR, NULL_VECTOR);
- DispatchSpawn(entity);
- AcceptEntityInput(entity, "Hurt", client, client);
- RemoveEdict(entity);
- DispatchKeyValue(target, "targetname", "");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement