Запуск плагина в определенном раунде

Lima

Участник
Сообщения
159
Реакции
57
Всем привет, есть ли способ запускать плагин в определенном раунде на картах?

P.S Plugin Manager не подходит, надо чтобы плагин запускался сам (в определенном раунде) на всех картах.
 

Lima

Участник
Сообщения
159
Реакции
57
Предположим в 5.
Если не существует плагина под такие нужды, подскажите пожалуйста пример кода для запуска определенного события в нужном раунде.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Lima

Участник
Сообщения
159
Реакции
57
AlmazON, а конкретно в плагине это можно реализовать, запуск определенного события в нужном раунде? (если можно пример кода)
 

Lima

Участник
Сообщения
159
Реакции
57
AlmazON, можно на примере этого vip плагина (по аналогии попробую сделать и в других плагинах)
PHP:
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <cstrike>

#define ADMFLAG_NEEDED ADMFLAG_CUSTOM6

#define DATA "2.0"

public Plugin:myinfo =
{
	name = "SM Franug Vip Features",
	author = "Franc1sco franug",
	description = "Features for vips",
	version = DATA,
	url = "http://claninspired.com/"
};

new Handle:trie_armas;

new Handle:timers[MAXPLAYERS+1];

new ACCOUNT_OFFSET;

public OnPluginStart()
{
	CreateConVar("sm_franugvipfeatures_version", DATA, "", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
	
	trie_armas = CreateTrie();
	
	HookEvent("player_spawn", Event_PlayerSpawn);
	HookEvent("round_end", RoundEnd);
	
	ACCOUNT_OFFSET = FindSendPropOffs("CCSPlayer", "m_iAccount");
	
	for(new i = 1; i <= MaxClients; i++)
		if(IsClientInGame(i))
		{
			OnClientPutInServer(i);
			OnClientPostAdminCheck(i);
		}
}

public OnClientPutInServer(client)
{
	SDKHook(client, SDKHook_WeaponEquipPost, EventItemPickup2);
}

public OnClientPostAdminCheck(client)
{
	if(GetUserFlagBits(client) & ADMFLAG_NEEDED) timers[client] = CreateTimer(3.0, Darm, client, TIMER_REPEAT);
}

public OnClientDisconnect(client)
{
	if(timers[client] != INVALID_HANDLE)
	{
		KillTimer(timers[client]);
		timers[client] = INVALID_HANDLE;
	}
}

public Action:Darm(Handle:timer, any:client)
{
	if(IsPlayerAlive(client))
	{
		new weapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon");
		if(weapon > 0 && (weapon == GetPlayerWeaponSlot(client, CS_SLOT_PRIMARY) || weapon == GetPlayerWeaponSlot(client, CS_SLOT_SECONDARY)))
		{
			new warray;
			decl String:classname[4];
			//GetEdictClassname(weapon, classname, sizeof(classname));
			Format(classname, 4, "%i", GetEntProp(weapon, Prop_Send, "m_iItemDefinitionIndex"));
			
			if(GetTrieValue(trie_armas, classname, warray))
			{
				//PrintToChat(client, "municion fijado a %i",warray[1]);
				if(GetReserveAmmo(weapon) != warray) SetEntProp(weapon, Prop_Send, "m_iPrimaryReserveAmmoCount", warray);
			}
		}
	}
}

stock GetReserveAmmo(weapon)
{
    return GetEntProp(weapon, Prop_Send, "m_iPrimaryReserveAmmoCount");
}

public Action:EventItemPickup2(client, weapon)
{
	if(weapon == GetPlayerWeaponSlot(client, CS_SLOT_PRIMARY) || weapon == GetPlayerWeaponSlot(client, CS_SLOT_SECONDARY))
	{
		new warray;
		decl String:classname[4];
		//GetEdictClassname(weapon, classname, sizeof(classname));
		Format(classname, 4, "%i", GetEntProp(weapon, Prop_Send, "m_iItemDefinitionIndex"));
	
		if(!GetTrieValue(trie_armas, classname, warray))
		{
			warray = GetEntProp(weapon, Prop_Send, "m_iPrimaryReserveAmmoCount");
		
			SetTrieValue(trie_armas, classname, warray);
		}
		else
		{
			if(GetUserFlagBits(client) & ADMFLAG_NEEDED) SetEntProp(weapon, Prop_Send, "m_iPrimaryReserveAmmoCount", warray);
		}
	}
}

public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{	
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	
	if(GetClientTeam(client) < 2) return;
	
	if(!(GetUserFlagBits(client) & ADMFLAG_NEEDED)) return;

	new iEnt;
	
	while ((iEnt = GetPlayerWeaponSlot(client, 3)) != -1)
	{
		RemovePlayerItem(client, iEnt);
		AcceptEntityInput(iEnt, "Kill");
	}
	
	GivePlayerItem(client, "weapon_hegrenade");
	GivePlayerItem(client, "weapon_flashbang");
	GivePlayerItem(client, "weapon_smokegrenade");
	GivePlayerItem(client, "weapon_molotov");
	if(GetClientTeam(client) == CS_TEAM_CT) SetEntProp(client, Prop_Send, "m_bHasDefuser", 1);
	
	while ((iEnt = GetPlayerWeaponSlot(client, 2)) != -1)
	{
		RemovePlayerItem(client, iEnt);
		AcceptEntityInput(iEnt, "Kill");
	}
	GivePlayerItem(client, "weapon_knife");
	GivePlayerItem(client, "weapon_taser");
	
	FakeClientCommand(client,"use weapon_knife");
	
	SetEntData(client, ACCOUNT_OFFSET, GetEntData(client, ACCOUNT_OFFSET)+300);
}

public RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
	if (CheckMapEnd())
	{
		Pasar();
    }
}

Pasar()
{
	for(new i=1;i<=MaxClients;++i)
	{
		if(!IsClientInGame(i) || GetClientTeam(i) > 1) continue;
		
		if(!(GetUserFlagBits(i) & ADMFLAG_NEEDED)) continue;
		
		ChangeClientTeam(i, GetRandomInt(2, 3));

	}
}


bool:CheckMapEnd()
{
	new win = GetConVarInt(FindConVar("mp_maxrounds"));
	
	if(win > 0)
	{
		win = RoundToNearest(win/2.0);
		
		if(GetTeamScore(CS_TEAM_CT) == win || GetTeamScore(CS_TEAM_T) == win) return true;
		
		return false;
	}
		
	new timeleft;
	GetMapTimeLeft(timeleft);
	if (timeleft <= 0) return true;
	
	return false;
}
 

Lima

Участник
Сообщения
159
Реакции
57
Вообщем нашел простенький VIP плагин:
PHP:
#include <sourcemod>
#include <sdktools>
#include <cstrike>
  
public OnPluginStart()  
{  
    HookEvent("round_start", roundStart);  
}
  
public Action:roundStart(Handle:event, const String:name[], bool:dontBroadcast) 
{
   for ( new client = 1 ; client <= MaxClients+1 ; client++){ 
      if (IsPlayerGenericAdmin(client)){
         if (IsValidClient(client, true)){
            new team = GetClientTeam(client);
            SetEntProp(client, Prop_Send, "m_ArmorValue", 100, 4); //armor
            SetEntProp(client, Prop_Send, "m_bHasHelmet", 1); //helm
           
            GivePlayerItem(client, "weapon_flashbang"); //flash
            GivePlayerItem(client, "weapon_flashbang"); //flash
            GivePlayerItem(client, "weapon_hegrenade"); //grenade
        
            if (GetTeamScore(CS_TEAM_T)+GetTeamScore(CS_TEAM_CT) > 1){
               decl CurrentMoney;  
               CurrentMoney = GetEntProp(client, Prop_Send, "m_iAccount");  
               SetEntProp(client, Prop_Send, "m_iAccount", CurrentMoney + 1500);
            }
           
            if(team == CS_TEAM_CT)
            {
               GivePlayerItem(client, "item_defuser");
            }
         }
      }   
    }
}
 
bool:IsPlayerGenericAdmin(client)
{
   return CheckCommandAccess(client, "generic_admin", ADMFLAG_GENERIC, false);
}
 
bool:IsValidClient(client, bool:alive = false)  
{  
    return (client >= 1 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && (alive == false || IsPlayerAlive(client)));  
}
Немного изменил чтоб гранаты выдавались также как и деньги со 2 раунда:
PHP:
#include <sourcemod>
#include <sdktools>
#include <cstrike>
  
public OnPluginStart()  
{  
    HookEvent("round_start", roundStart);  
}
  
public Action:roundStart(Handle:event, const String:name[], bool:dontBroadcast) 
{
   for ( new client = 1 ; client <= MaxClients+1 ; client++){ 
      if (IsPlayerGenericAdmin(client)){
         if (IsValidClient(client, true)){
            new team = GetClientTeam(client);
        
            if (GetTeamScore(CS_TEAM_T)+GetTeamScore(CS_TEAM_CT) > 1){
               decl CurrentMoney;  
               CurrentMoney = GetEntProp(client, Prop_Send, "m_iAccount");  
               SetEntProp(client, Prop_Send, "m_iAccount", CurrentMoney + 1500);
               SetEntProp(client, Prop_Send, "m_ArmorValue", 100, 4); //armor
               SetEntProp(client, Prop_Send, "m_bHasHelmet", 1); //helm
           
               GivePlayerItem(client, "weapon_flashbang"); //flash
               GivePlayerItem(client, "weapon_flashbang"); //flash
               GivePlayerItem(client, "weapon_hegrenade"); //grenade
            }
           
            if(team == CS_TEAM_CT)
            {
               GivePlayerItem(client, "item_defuser");
            }
         }
      }   
    }
}
 
bool:IsPlayerGenericAdmin(client)
{
   return CheckCommandAccess(client, "generic_admin", ADMFLAG_GENERIC, false);
}
 
bool:IsValidClient(client, bool:alive = false)  
{  
    return (client >= 1 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && (alive == false || IsPlayerAlive(client)));  
}
Плагин работает со 2 раунда , но вот в чем проблема, при смене команд местами (teamswitch) на пистолетном раунде игрок получает гранаты и броню (что не есть хорошо), как заставить счетчик снова отсчитать 1 раунд чтоб выдать набор плюшек?
 

Tallanvor

НЕ ПИШУ я плагины!!! И не правлю! И ваще...
Сообщения
1,352
Реакции
554
Сверху Снизу