Skocz do zawartości
szogun

[Brak rozwiązania] Dmg z molotova

Rekomendowane odpowiedzi

Mam malutki problem z pluginem który zadaje dmg po wejściu w molotova od swojej drużyny

 

#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

#define PLUGIN_AUTHOR "f0re4ch"
#define PLUGIN_VERSION "1.0"

public Plugin:myinfo =
{
	name = "Competitive Anti-FF",
	author = PLUGIN_AUTHOR,
	description = "Protects Players from Friendly-Fire but enable molotov damage",
	version = PLUGIN_VERSION,
	url = "http://kpservidores.com"
};

public OnClientPutInServer(int client)
{
    SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3])
{
	int attackerUserId = attacker;
	int victimUserId = victim;

	char WeaponCallBack[32];
	GetEdictClassname(inflictor, WeaponCallBack, sizeof(WeaponCallBack));

	if ((!IsValidEntity(victimUserId)) || (!IsValidEntity(attackerUserId)))
		return Plugin_Continue;

	if ((strlen(WeaponCallBack) <= 0) || (attackerUserId == victimUserId) || (GetClientTeam(victimUserId) != GetClientTeam(attackerUserId)) )
		return Plugin_Continue;

	if (StrEqual(WeaponCallBack, "inferno", false))
		return Plugin_Continue;

	return Plugin_Handled;
}

 

 

 [SM] Exception reported: Client index 306 is invalid
 [SM] Blaming: no_ff_molotov.smx
 [SM] Call stack trace:
 [SM] [0] GetClientTeam
 [SM] [1] Line 21, no_ff_molotov.sp::OnTakeDamage
[SM] Exception reported: Client index 306 is invalid

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przed sprawdzaniem drużyny klienta nie sprawdzasz czy jest w ogóle połączony z serwerem lub czy jest w grze, stąd error

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
if (IsValidClient(client))

Maybe?

 

@edit @Mesharskyzapomniałem xd

Edytowane przez Bioły

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
42 minuty temu, Bioły napisał:

if (IsValidClient(client))

Maybe?

Samo IsValidClient nie wystarczy ? Trzeba też to utworzyć na dole

 

bool IsValidClient(int client)
{
	if(client >= 1 && client <= MaxClients && IsClientInGame(client))
		return true;
	return false;
}

No i zrobić to tak:

 

if (!IsValidClient(client))
{
	return;
}

 

Efekt powinien wyglądać +- tak

 

Spoiler

/*	Copyright (C) 2019 f0re4ch
	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
	
	You should have received a copy of the GNU General Public License
	along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#pragma newdecls required
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

#define PLUGIN_AUTHOR "f0re4ch"
#define PLUGIN_VERSION "1.0"

public Plugin myinfo =
{
	name = "Competitive Anti-FF",
	author = PLUGIN_AUTHOR,
	description = "Protects Players from Friendly-Fire but enable molotov damage",
	version = PLUGIN_VERSION,
	url = "http://kpservidores.com"
};

public void OnClientPutInServer(int client)
{
    SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3])
{
	int attackerUserId = attacker;
	int victimUserId = victim;

	char WeaponCallBack[32];
	GetEdictClassname(inflictor, WeaponCallBack, sizeof(WeaponCallBack));

	if(!IsValidClient(attacker))
	{
		return Plugin_Continue;
	}

	if ((!IsValidEntity(victimUserId)) || (!IsValidEntity(attackerUserId)))
		return Plugin_Continue;

	if ((strlen(WeaponCallBack) <= 0) || (attackerUserId == victimUserId) || (GetClientTeam(victimUserId) != GetClientTeam(attackerUserId)) )
		return Plugin_Continue;

	if (StrEqual(WeaponCallBack, "inferno", false))
		return Plugin_Continue;

	return Plugin_Handled;
}

bool IsValidClient(int client)
{
	if(client >= 1 && client <= MaxClients && IsClientInGame(client))
		return true;
	return false;
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Coś mi to nie do końca działa na sm_cvar mp_friendlyfire 1 zabiera dmg nawet przy strzelaniu do swojego a nie jak było założenie aby tylko molotov mógł zabierać dmg.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sprawdź czy na pewno obrażenia od mołotowa nazywają się "inferno" poprzez wyświetlanie nazwy WeaponCallBack zaraz przed ostatnim if'em

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Temat został zamknięty i przeniesiony do działu "Przestarzałe tematy". Powodem jest brak rozwiązania problemu zawartego w temacie lub brak zainteresowania autora w jego rozwiązaniu.

 

Jeśli się z tym nie zgadzasz, zaraportuj ten post z prośbą o ponowne otwarcie i kontynuację dyskusji.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...