Увеличение урона в 2 раза

Webman

Nevermind
Сообщения
803
Реакции
330
Здравствуйте. Помогите, пожалуйста.

Хочу сделать увеличение урона (damage) в 2 раза.
Например, чтобы удар с ножа снимал не 65hp, а 130 hp

PHP:
#include <sourcemod> 
 #include <sdktools> 

 public OnPluginStart() 
 { 
      HookEvent("player_hurt", EventPlayerHurt, EventHookMode_Pre); 
 } 

 public Action:EventPlayerHurt(Handle:event, const String:name[],bool:dontBroadcast) 
 { 
      new victim = GetClientOfUserId(GetEventInt(event, "userid"));
      new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
      // code 
 }
Подскажите, как сделать. Заранее спасибо.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
PHP:
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{    
    damage = damage*2;
        return Plugin_Changed;
}
 

SaInT.P

Участник
Сообщения
1,268
Реакции
226
Webman, с чего бы это? удар в спину снимает 175 хп
 

Webman

Nevermind
Сообщения
803
Реакции
330
Подскажите, пожалуйста. Вот так правильно будет?

PHP:
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    new WeaponIndex;
    decl String:ClassName[30];
    WeaponIndex = GetEntPropEnt(attacker, Prop_Send, "m_hActiveWeapon");
    GetEdictClassname(WeaponIndex, ClassName, sizeof(ClassName));
    
    if (StrEqual("weapon_awp", ClassName, false))
    {
    damage = damage*2;
    return Plugin_Changed;
    }
    return Plugin_Handled;
}
По поводу 5 строчки сомнения.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
Webman, да. Но почему бы не сделать сразу так:

PHP:
new WeaponIndex = GetEntPropEnt(attacker, Prop_Send, "m_hActiveWeapon");

И еще если
PHP:
damage = damage*2;
не проканает то так:
PHP:
damage = float(damage*2);

И в конце должно быть не
PHP:
return Plugin_Handled;
а
PHP:
return Plugin_Continue;
 

Webman

Nevermind
Сообщения
803
Реакции
330
Возвращаюсь к данной теме снова, т.к. не получается что-то:
Вот код:
PHP:
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    new WeaponIndex = GetEntPropEnt(attacker, Prop_Send, "m_hActiveWeapon");
    decl String:ClassNameZ[30];
    GetEdictClassname(WeaponIndex, ClassNameZ, sizeof(ClassNameZ));
    if (StrEqual("weapon_deagle", ClassNameZ, false))
    {
        damage = float(damage*5);
        return Plugin_Changed;
    }
    return Plugin_Handled;
}
Пробовал с/без float() - не работает.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
Webman, пробуй так

PHP:
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
	decl String:sWeapon[24];
	GetClientWeapon(attacker, sWeapon, sizeof(sWeapon));
	if (StrEqual(sWeapon[7], "deagle"))
	{
		damage = damage*5;
		return Plugin_Changed;
	}
	return Plugin_Handled;
}
 
Последнее редактирование:

Ровный Кент

Участник
Сообщения
703
Реакции
121
Пробуй
PHP:
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
if (GetClientTeam(attacker) == 3)
{
damage = damage*5;
return Plugin_Changed;
}
return Plugin_Continue;
}

А как сделать привязку к steamid ? Например чтоб только определенный игрок мог наносить x2 урона?
 

Webman

Nevermind
Сообщения
803
Реакции
330
А как сделать привязку к steamid ? Например чтоб только определенный игрок мог наносить x2 урона?

Пробуй

PHP:
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
   if (attacker <= 0 || attacker > MaxClients)
     return Plugin_Continue;
    
   decl String:steamId[32];
   GetClientAuthString(attacker, steamId, sizeof(steamId));
  
   if (!strcmp(steamId, "STEAM_0:1:234567890"))
   {
     damage = damage*2;
     return Plugin_Changed;
   }
  
   return Plugin_Continue;
}
 

Ровный Кент

Участник
Сообщения
703
Реакции
121
Пробуй

PHP:
public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
   if (attacker <= 0 || attacker > MaxClients)
     return Plugin_Continue;
  
   decl String:steamId[32];
   GetClientAuthString(attacker, steamId, sizeof(steamId));

   if (!strcmp(steamId, "STEAM_0:1:111"))
   {
     damage = damage*2;
     return Plugin_Changed;
   }

   return Plugin_Continue;
}

А вот так ? :

C-подобный:
#include <sourcemod>
#include <sdktools>


public Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
if (attacker <= 0 || attacker > MaxClients)
return Plugin_Continue;

decl String:steamid[32];
GetClientAuthId(attacker, AuthId_Steam3, steamid, sizeof(steamid));

if (!strcmp(steamid, "STEAM_0:1:90969126"))
{
damage = damage*10;
return Plugin_Changed;
}

return Plugin_Continue;
}
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #18
Лучше использовать SDKHook. С его помощью можно получить и оружие и атакующего и урон.
PHP:
#include <sdkhooks>

bool bAuthorized[MAXPLAYERS+1];
char cSteamIDs[][32] = {
   "STEAM_0:0:123456",
   "STEAM_0:1:111111"
};

public void OnClientPutInServer(int client)
{
   bAuthorized[client] = GetAuthentication(client);
   
   SDKHook(client, SDKHook_OnTakeDamageAlive, OnTakeDamageAlive);
}

public Action OnTakeDamageAlive(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
   if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
   {
     damage *= 2.0;
     return Plugin_Changed;
   }
   
   return Plugin_Continue;
}

bool GetAuthentication(int client)
{
   char cAuth[32];
   GetClientAuthId(client, AuthId_Engine, cAuth, sizeof(cAuth));
   
   for (int i = 0; i < sizeof(cSteamIDs); ++i)
   {
     if (strcmp(cAuth, cSteamIDs[i], false) == 0)
       return true;
   }
   
   return false;
}
 

Ровный Кент

Участник
Сообщения
703
Реакции
121
Лучше использовать SDKHook. С его помощью можно получить и оружие и атакующего и урон.
PHP:
#include <sdkhooks>

bool bAuthorized[MAXPLAYERS+1];
char cSteamIDs[][32] = {
   "STEAM_0:0:123456",
   "STEAM_0:1:111111"
};

public void OnClientPutInServer(int client)
{
   bAuthorized[client] = GetAuthentication(client);
  
   SDKHook(client, SDKHook_OnTakeDamageAlive, OnTakeDamageAlive);
}

public Action OnTakeDamageAlive(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
   if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
   {
     damage *= 2.0;
     return Plugin_Changed;
   }
  
   return Plugin_Continue;
}

bool GetAuthentication(int client)
{
   char cAuth[32];
   GetClientAuthId(client, AuthId_Engine, cAuth, sizeof(cAuth));
  
   for (int i = 0; i < sizeof(cSteamIDs); ++i)
   {
     if (strcmp(cAuth, cSteamIDs[i], false) == 0)
       return true;
   }
  
   return false;
}

damage *= 2.0; // Float ?
То есть можно и damage *= 1.7 вместо 2.0 ?
 
Сверху Снизу