Skocz do zawartości
szogun

[Rozwiązane] Znikające modele w vipie

Rekomendowane odpowiedzi

Witajcie, mam mały problem z znikaniem modeli broni gdy wchodzi vip na serwer. Kiedyś doradziła mi jedna osoba że może być to przez GivePlayerItem i żeby dodać do tego timer opóźniający dawanie granatów itp lecz niestety nadal mi to nie pomogło.

 

#include <sourcemod>
#include <cstrike>
#include <sdktools>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =
{
	name = "[CS:GO] VIP",
	author = "xBonio & Avgariat & Vasto_Lorde",
	description = "VIP Generator by cs-plugin.com",
	version = "1.0",
	url = "http://cs-plugin.com"
};

char tag[64] = "VIP";

int offsetHe;
int offsetFlash;
int offsetSmoke;
int offsetInc;
int offsetMol;

public void OnPluginStart()
{
	HookEvent("bomb_planted", EventBombPlanted);
	HookEvent("bomb_defused", EventBombDefused);
	HookEvent("player_spawn", PlayerSpawn);
	HookEvent("player_death", PlayerDeath);
}

public void OnMapStart()
{
	
	int entindex;

	entindex = CreateEntityByName("weapon_hegrenade");
	DispatchSpawn(entindex);
	offsetHe = GetEntProp(entindex, Prop_Send, "m_iPrimaryAmmoType");
	AcceptEntityInput(entindex, "Kill");

	entindex = CreateEntityByName("weapon_flashbang");
	DispatchSpawn(entindex);
	offsetFlash = GetEntProp(entindex, Prop_Send, "m_iPrimaryAmmoType");
	AcceptEntityInput(entindex, "Kill");

	entindex = CreateEntityByName("weapon_smokegrenade");
	DispatchSpawn(entindex);
	offsetSmoke = GetEntProp(entindex, Prop_Send, "m_iPrimaryAmmoType");
	AcceptEntityInput(entindex, "Kill");

	entindex = CreateEntityByName("weapon_incgrenade");
	DispatchSpawn(entindex);
	offsetInc = GetEntProp(entindex, Prop_Send, "m_iPrimaryAmmoType");
	AcceptEntityInput(entindex, "Kill");
	
	entindex = CreateEntityByName("weapon_molotov");
	DispatchSpawn(entindex);
	offsetMol = GetEntProp(entindex, Prop_Send, "m_iPrimaryAmmoType");
	AcceptEntityInput(entindex, "Kill");

}


public Action PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(!IsPlayerVIP(client)) return Plugin_Continue;
	CreateTimer(1.0, Timer_DelaySpawn, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
	return Plugin_Continue;
}

public Action Timer_DelaySpawn(Handle timer, any data)
{
	int client;
	
	if ((client = GetClientOfUserId(data)) == 0)
	{
		return Plugin_Stop;
	}
	
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
	SetEntProp(client, Prop_Send, "m_ArmorValue", 100);
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
	SetEntProp(client, Prop_Send, "m_bHasHelmet", 1);
	int money = GetEntProp(client, Prop_Send, "m_iAccount");
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
	SetEntProp(client, Prop_Send, "m_iAccount", money+200);
	if(GetClientTeam(client) == CS_TEAM_CT)
	if(GetEntProp(client, Prop_Send, "m_bHasDefuser") == 0) GivePlayerItem(client, "item_defuser");
	for(int x = 0; x < 1; x++)
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
	if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetHe) < 1) GivePlayerItem(client, "weapon_hegrenade");
	for(int x = 0; x < 1; x++)
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
	if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetFlash) < 1) GivePlayerItem(client, "weapon_flashbang");
	for(int x = 0; x < 1; x++)
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
	if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetSmoke) < 1) GivePlayerItem(client, "weapon_smokegrenade");
	if(GetClientTeam(client) == CS_TEAM_CT)
	{
		for(int x = 0; x < 1; x++)                                            // ilosc inc
		if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0) 
		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetInc) < 1) GivePlayerItem(client, "weapon_incgrenade");
	}
	else if(GetClientTeam(client) == CS_TEAM_T)
	{
		for(int x = 0; x < 1; x++)
		if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetMol) < 1) GivePlayerItem(client, "weapon_molotov");
	}
	
	return Plugin_Stop;
}
public Action PlayerDeath(Handle event, const char[] name, bool dontBroadcast)
{
	int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	if(!IsValidPlayer(attacker) || !IsPlayerVIP(attacker)) return;
	int health = GetClientHealth(attacker);
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
	SetEntityHealth(attacker, health+5);
	int money = GetEntProp(attacker, Prop_Send, "m_iAccount");
	SetEntProp(attacker, Prop_Send, "m_iAccount", money+100);
	bool headshot = GetEventBool(event, "headshot", false);
	if(headshot)
	{
		health = GetClientHealth(attacker);
		if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0)
		SetEntityHealth(attacker, health+5);
		money = GetEntProp(attacker, Prop_Send, "m_iAccount");
		SetEntProp(attacker, Prop_Send, "m_iAccount", money+150);
	}
	if(GetClientHealth(attacker) > 100)
				SetEntityHealth(attacker, 100);
}

public Action EventBombPlanted(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	int money = GetEntProp(client, Prop_Send, "m_iAccount");
	if(IsPlayerVIP(client))
		SetEntProp(client, Prop_Send, "m_iAccount", money+150);
}
public Action EventBombDefused(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	int money = GetEntProp(client, Prop_Send, "m_iAccount");
	if(IsPlayerVIP(client))
		SetEntProp(client, Prop_Send, "m_iAccount", money+150);
}

public void OnClientPostAdminCheck(int client)
{
	if(IsPlayerVIP(client))
	{
			
		PrintToChatAll(" %s \x03%N\x01 \x01", tag, client);
	}
}

stock bool IsValidPlayer(int client)
{
    if(client >= 1 && client <= MaxClients && IsClientInGame(client) && IsClientConnected(client) && !IsFakeClient(client) && !IsClientReplay(client) && !IsClientSourceTV(client))
        return true;
    return false;
}
stock bool IsPlayerVIP(int client)
{
	if(GetUserFlagBits(client) & ADMFLAG_CUSTOM6)
		return true;
	return false;
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sam nie wiem co może powodować problem, ale można spróbować z tym pokombinować troche...

 

spróbuj usunąć z vipa wszystkie GivePlayerItem'y is sprawdzić, czy problem dalej występuje

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeżeli na serwerze są aktywne pluginy typu !ws, !knife, to bardziej prawdopodobne, że one to powodują. Skąd pewność, że problemy pojawiają się przez plugin do Vipa?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Obecnie mam wyłączone owe pluginy, na potrzeb testow, serwera są one wyłączone okolo tygodnia i w tym okresie rowniez znikał model broni gdy wchodził vip w momencie wyłączenia samego vipa problem nie występuje

Edytowane przez szogun

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kawałek kodu, w którym kiedyś to poprawiałem:

 

public Action PlayerSpawn(Event event, const char[] name, bool dontBroadcast) 
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(IsValidPlayer(client) && IsPlayerVIP(client))
	{
		if(IsPlayerAlive(client))
		{
			CreateTimer(0.1, GiveEquipment, GetEventInt(event, "userid"), TIMER_FLAG_NO_MAPCHANGE);
		}
	}
}
public Action GiveEquipment(Handle timer, any userid) {
	int client = GetClientOfUserId(userid);
   
	if(!IsPlayerAlive(client) || !IsValidPlayer(client)) return;
  
   
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0 && GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 15)
	{  
		SetEntProp(client, Prop_Send, "m_ArmorValue", 100);
		SetEntProp(client, Prop_Send, "m_bHasHelmet", 1);

		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetHe) < 1) 
			GivePlayerItem(client, "weapon_hegrenade");
		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetFlash) < 1) 
			GivePlayerItem(client, "weapon_flashbang");
		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetSmoke) < 1) 
			GivePlayerItem(client, "weapon_smokegrenade");

		if(GetClientTeam(client) == CS_TEAM_CT) 
			if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetInc) < 1) 
				GivePlayerItem(client, "weapon_incgrenade");

		if(GetClientTeam(client) == CS_TEAM_T)
			if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetMol) < 1) 
				GivePlayerItem(client, "weapon_molotov");
	}
	
	SetEntityHealth(client, 110);
	CS_SetClientClanTag(client, tag);
	if(GetClientTeam(client) == CS_TEAM_CT)
		if (GetEntProp(client, Prop_Send, "m_bHasDefuser") == 0)
			GivePlayerItem(client, "item_defuser");
}
stock bool IsValidPlayer(int client)
{
    if(client >= 1 && client <= MaxClients && IsClientInGame(client) && IsClientConnected(client) && !IsFakeClient(client) && !IsClientReplay(client) && !IsClientSourceTV(client))
        return true;
    return false;
}

Nie pamiętam czy wszystkie warunki są konieczne - potestuj sobie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

1 godzinę temu, Scorpion Flail napisał:

Kawałek kodu, w którym kiedyś to poprawiałem:

 


public Action PlayerSpawn(Event event, const char[] name, bool dontBroadcast) 
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(IsValidPlayer(client) && IsPlayerVIP(client))
	{
		if(IsPlayerAlive(client))
		{
			CreateTimer(0.1, GiveEquipment, GetEventInt(event, "userid"), TIMER_FLAG_NO_MAPCHANGE);
		}
	}
}
public Action GiveEquipment(Handle timer, any userid) {
	int client = GetClientOfUserId(userid);
   
	if(!IsPlayerAlive(client) || !IsValidPlayer(client)) return;
  
   
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0 && GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 15)
	{  
		SetEntProp(client, Prop_Send, "m_ArmorValue", 100);
		SetEntProp(client, Prop_Send, "m_bHasHelmet", 1);

		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetHe) < 1) 
			GivePlayerItem(client, "weapon_hegrenade");
		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetFlash) < 1) 
			GivePlayerItem(client, "weapon_flashbang");
		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetSmoke) < 1) 
			GivePlayerItem(client, "weapon_smokegrenade");

		if(GetClientTeam(client) == CS_TEAM_CT) 
			if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetInc) < 1) 
				GivePlayerItem(client, "weapon_incgrenade");

		if(GetClientTeam(client) == CS_TEAM_T)
			if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetMol) < 1) 
				GivePlayerItem(client, "weapon_molotov");
	}
	
	SetEntityHealth(client, 110);
	CS_SetClientClanTag(client, tag);
	if(GetClientTeam(client) == CS_TEAM_CT)
		if (GetEntProp(client, Prop_Send, "m_bHasDefuser") == 0)
			GivePlayerItem(client, "item_defuser");
}
stock bool IsValidPlayer(int client)
{
    if(client >= 1 && client <= MaxClients && IsClientInGame(client) && IsClientConnected(client) && !IsFakeClient(client) && !IsClientReplay(client) && !IsClientSourceTV(client))
        return true;
    return false;
}

Nie pamiętam czy wszystkie warunki są konieczne - potestuj sobie.

Poprawiony kod:

Spoiler

public Action PlayerSpawn(Event event, const char[] name, bool dontBroadcast) 
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(IsPlayerVIP(client))	//Jeżeli się zrespił, to raczej jest valid. Ponadto sprawdzasz to samo w timerze, więc zbędne.
	{
//		if(IsPlayerAlive(client))	//Jeżeli właśnie się odrodził, to jest żywy. Ponadto sprawdzasz to samo w timerze, więc zbędne. ;>
		CreateTimer(0.1, GiveEquipment, client, TIMER_FLAG_NO_MAPCHANGE);	//Po co przekazywać userid, jeżeli i tak potrzebny jest client ?
	}
}
public Action GiveEquipment(Handle timer, any client) {
//	int client = GetClientOfUserId(userid);
   
	if(!IsValidPlayer(client, true)) return;	//Sprawdza czy valid i czy żywy
  
   
	if(GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 0 && GetTeamScore(CS_TEAM_CT) + GetTeamScore(CS_TEAM_T) != 15)
	{  
		SetEntProp(client, Prop_Send, "m_ArmorValue", 100);
		SetEntProp(client, Prop_Send, "m_bHasHelmet", 1);
		int money = GetEntProp(client, Prop_Send, "m_iAccount");	//Twoja wersja nie zawiera dodatkowej gotówki
		SetEntProp(client, Prop_Send, "m_iAccount", money+200);		//Twoja wersja nie zawiera dodatkowej gotówki

		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetHe) < 1) 
			GivePlayerItem(client, "weapon_hegrenade");
		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetFlash) < 1) 
			GivePlayerItem(client, "weapon_flashbang");
		if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetSmoke) < 1) 
			GivePlayerItem(client, "weapon_smokegrenade");

		if(GetClientTeam(client) == CS_TEAM_CT) 
			if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetInc) < 1) 
				GivePlayerItem(client, "weapon_incgrenade");

		if(GetClientTeam(client) == CS_TEAM_T)
			if(GetEntProp(client, Prop_Send, "m_iAmmo", _, offsetMol) < 1) 
				GivePlayerItem(client, "weapon_molotov");
	}
	
//	SetEntityHealth(client, 110);	//Wersja autora nie dodaje HP
//	CS_SetClientClanTag(client, tag);	//Wersja autora nie ingeruje w tag grupy
	if(GetClientTeam(client) == CS_TEAM_CT)
		if (GetEntProp(client, Prop_Send, "m_bHasDefuser") == 0)
			GivePlayerItem(client, "item_defuser");
}
//Wersja tego stocka z możliwościa sprawdzenia, czy gracz jest żywy
stock bool IsValidPlayer(int client, bool bAlive = false)
{
	if(client >= 1 && client <= MaxClients && IsClientInGame(client) && !IsFakeClient(client) && (!bAlive || IsPlayerAlive(client)))
		return true;
	return false;
}

 

@szogun W ogóle jeżeli masz problemy z tym pluginem, to spróbuj użyć Vipa Mesharskiego i ewentualnie dodać elementu kodu, jeżeli czegoś Ci tam brakuje. Z tego co widzę, to jest wygenerowany Vip z naszego generatora. Jednak robiliśmy go już bardzo dawno temu. Niektóre sposoby mogą być już niekoniecznie efektywne.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Temat został zamknięty. Powodem jest całkowite rozwiązanie problemu zawartego w temacie.

 

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ę...