Medusa

Spawn T на место CT в Kz Auto Add Spawns

10 постов в топике

Spawn T на место CT в Kz Auto Add Spawns

Привет. Такая ситуация, нужно создать T спавн игроков на том месте, на котором находятся  CT спавны. 

Необходимо все для kreedz сервера, где обычно на картах нет Т спавнов, или они в какой-то жо*е (да я пускаю игроков за команду террористов). И т.к. я использую плагин Kz Auto Add Spawns, думал сразу реализовать все в нем, т.к. там сразу удаляются T спавны - <engfunc(EngFunc_RemoveEntity, iEnt)> (не уверен нужно ли их удалять перед созданием) и идут манипуляции со спавнами CT.

 

В общем пытался я создать там новую энтити, в месте где создаются  CT спавны:

new iszClassNameTT = engfunc(EngFunc_AllocString, "info_player_deathmatch")
  
iEnt = engfunc(EngFunc_CreateNamedEntity, iszClassNameTT)
DispatchKeyValueCustom(iEnt, "angles", mTempDatas[m_szAngles])
DispatchKeyValueCustom(iEnt, "origin", mTempDatas[m_szOrigins])
dllfunc(DLLFunc_Spawn, iEnt)

Но ничего не вышло, пробовал еще пару способов (aka fakameta_util), но что-то не выходит у меня.

 

Kz Auto Add Spawns - сам плагин

Спойлер

#include <amxmodx>
#include <fakemeta>

#define VERSION "0.1.2"
#define PLUGIN "Kz Auto Add Spawns"

new g_pCvarMapsSpawns

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, "ConnorMcLeod")

	new iEnt = FM_NULLENT, iCount
	while( (iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "info_player_deathmatch")) )
	{
		engfunc(EngFunc_RemoveEntity, iEnt)
		++iCount
	}

	new szCvarValue[19]
	get_pcvar_string(g_pCvarMapsSpawns, szCvarValue, charsmax(szCvarValue))
	format(szCvarValue, charsmax(szCvarValue), "%s T:0(%d)", szCvarValue, iCount)
	set_pcvar_string(g_pCvarMapsSpawns, szCvarValue)
}

public plugin_precache()
{
	enum _:SpawnsDatas
	{
		m_szAngles[64],
		m_szOrigins[64]
	}
	new Array:aSpawns = ArrayCreate(SpawnsDatas)
	new mTempDatas[SpawnsDatas]

	enum
	{
		iAngles,
		iOrigins,
		iClassName
	}
	new Trie:tKeyType = TrieCreate()
	TrieSetCell(tKeyType, "angles", iAngles)
	TrieSetCell(tKeyType, "origin", iOrigins)
	TrieSetCell(tKeyType, "classname", iClassName)

	new szMapFile[64]
	get_mapname(szMapFile, charsmax(szMapFile))
	format(szMapFile, charsmax(szMapFile), "maps/%s.bsp", szMapFile)

	new szBuffer[64], szKey[16], szValue[32], iType
	new bool:bInEntityDatas, bool:bIsInfoPlayerStartEntity
	new fp = fopen(szMapFile, "rb")

	new iOffset, iLength, iMaxPos
	fseek(fp, 4, SEEK_SET)
	fread(fp, iOffset, BLOCK_INT)
	fread(fp, iLength, BLOCK_INT)
	iMaxPos = iOffset + iLength
	fseek(fp, iOffset, SEEK_SET)

	while( ftell(fp) < iMaxPos )
	{
		fgets(fp, szBuffer, charsmax(szBuffer))
		trim(szBuffer)

		if( bInEntityDatas )
		{
			if( szBuffer[0] == '}' )
			{
				bInEntityDatas = false
				if( bIsInfoPlayerStartEntity )
				{
					ArrayPushArray(aSpawns, mTempDatas)
				}
			}
			else
			{
				parse(szBuffer, szKey, charsmax(szKey), szValue, charsmax(szValue))
				if( TrieGetCell(tKeyType, szKey, iType) )
				{
					switch( iType )
					{
						case iAngles:
						{
							copy(mTempDatas[m_szAngles], charsmax(mTempDatas[m_szAngles]), szValue)
						}
						case iOrigins:
						{
							copy(mTempDatas[m_szOrigins], charsmax(mTempDatas[m_szOrigins]), szValue)
						}
						case iClassName:
						{
							if( equal(szValue, "info_player_start") )
							{
								bIsInfoPlayerStartEntity = true
							}
						}
					}
				}
			}
		}
		else if( szBuffer[0] == '{' )
		{
			bInEntityDatas = true
			bIsInfoPlayerStartEntity = false
		}
	}
	fclose(fp)

	new iSpawnsNum = ArraySize( aSpawns )
/*	if( iSpawnsNum == 1 )
	{
		log_to_file("OnSpawns.log", "%s has only 1 spawn", szMapFile)
	}*/
	new iNeededSpawns = max(get_maxplayers() - iSpawnsNum, 0)

	new szCvarValue[19]
	formatex(szCvarValue, charsmax(szCvarValue), "CT:%d(%d)", iSpawnsNum + iNeededSpawns, iSpawnsNum)
	g_pCvarMapsSpawns = register_cvar("map_spawns", "", FCVAR_SERVER)
	set_pcvar_string(g_pCvarMapsSpawns, szCvarValue)

	if( iSpawnsNum > 0 && iNeededSpawns > 0 )
	{
		new iFactor = (iNeededSpawns / iSpawnsNum) + _:!!(iNeededSpawns % iSpawnsNum)
		new iszClassName = engfunc(EngFunc_AllocString, "info_player_start")

		set_kvd(0, KV_ClassName, "info_player_start")
		set_kvd(0, KV_fHandled, 0)
		for(new i, j, iEnt; i<iSpawnsNum; i++)
		{
			ArrayGetArray(aSpawns, i, mTempDatas)
			for(j=0; j<iFactor; j++)
			{
				iEnt = engfunc(EngFunc_CreateNamedEntity, iszClassName)
				DispatchKeyValueCustom(iEnt, "angles", mTempDatas[m_szAngles])
				DispatchKeyValueCustom(iEnt, "origin", mTempDatas[m_szOrigins])
				dllfunc(DLLFunc_Spawn, iEnt)

				if( --iNeededSpawns == 0 )
				{
					goto delete_datas
				}
			}
		}
	}

delete_datas:
	ArrayDestroy( aSpawns )
	TrieDestroy( tKeyType )
}

DispatchKeyValueCustom(iEntity, szKey[], szValue[])
{
	set_kvd(0, KV_KeyName, szKey)
	set_kvd(0, KV_Value, szValue)
	dllfunc(DLLFunc_KeyValue, iEntity, 0)
}

 

Link = https://forums.alliedmods.net/showthread.php?p=685835

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попытался сделать сам через engine , но дич выходит :D так и не смог понять, что да как.

Спойлер

#include <amxmodx>
#include <engine>

public plugin_init()
{
	
	register_plugin("T spawn to CT", "null", "null");
	
	register_clcmd("say /test1","pfn_keyvalue");

	new ent = find_ent_by_class(0, "info_player_start");
	new Float:vecorigin[3];
	entity_get_vector(ent, EV_VEC_origin, vecorigin);
	
	new Float:angles[3]
	entity_get_vector(ent, EV_VEC_angles, angles)

	new entspawn;
	entspawn = create_entity("info_player_deathmatch");

	entity_set_vector(entspawn, EV_VEC_angles, angles)
	entity_set_origin(entspawn, vecorigin);
	DispatchSpawn(entspawn);
}

public pfn_keyvalue(entid) 
{
    new classname[32], key[32], value[32];
    copy_keyvalue(classname, 31, key, 31, value, 31);

    if(equal(classname, "info_player_start"))
    {
        new newent = create_entity("info_player_deathmatch");
        entity_set_string(newent,EV_SZ_classname,"info_player_deathmatch");
        DispatchSpawn(newent);
    }
}

 

Порылся еще на форумах и нашел хороший код от @s1lent 

Спойлер

#include <amxmodx>
#include <fakemeta>

#pragma semicolon 1

#define PLUGIN "Teleport TerroristBase"
#define VERSION "1.0"
#define AUTHOR "s1lent"

new Float:g_vec[2][3];
new gCreatyVector;

public plugin_precache()        /* прекеш вызывается раньше, уже в это время вызываем функцию ForwardSpawn; */
{
	gCreatyVector = register_forward(FM_Spawn, "ForwardSpawn", 1);  /*Вызывается функция ForwardSpawn и делаем свою работу*/
}

public plugin_init()
{
	register_plugin(PLUGIN,VERSION,AUTHOR);
	register_clcmd("say /tep","teleeed"); /*Игрок вызывает функцию teleeed*/
	unregister_forward(FM_Spawn, gCreatyVector, 1); /* ForwardSpawn работу уже сделал, поэтому в дальнейшем он нам не нужен*/
}
/* ForwardSpawn до загрузки карты и вот что выполняется*/
public ForwardSpawn(ent)
{
	if(!pev_valid(ent))     /*Если энтитя info_player_start отсуствует на карте, игнорируем*/
		return FMRES_IGNORED;
	
	new classname[32];
	pev(ent, pev_classname, classname, sizeof classname - 1);
	
	if(equal(classname, "info_player_start")) /*Устанавливаем класс на info_player_start*/
	{
		pev(ent,pev_origin,g_vec[0]);   /* Определяем координаты info_player_start и сохраняем в массив g_vec*/
	}
	
	return FMRES_IGNORED;
}

public teleeed(id)
{
	engfunc(EngFunc_SetOrigin,id,g_vec[0]); /*Перемещаем игрока в наш заготовленный массив с сохраненой координатой*/
}

 

Пробовал интегрировать в Kz Auto Add Spawns, но криво криво криво.... либо не работало либо, наоборот спавн КТ улетал  кудато.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Medusa, а почему бы не использовать Map Spawns Editor и самому не расставить спавны там, где нужно?

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Le$hiy на кз серверах очень много карт замучается добавлять)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Garey Просто это единственный плагин для редактирования спавнов, которым я пользовался, и который имеет интуитивно понятное меню для самостоятельного расставления спавнов. Да, возможно придется помучиться. Зато каждый спавн можно поставить так, как хочешь сам. Нагрузка минимальная.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Le$hiy Тут дело в другом, мне даже хватит 1 спавна для всех игроков, и в ручную расставлять нет смысла т.к. карт возможно будет 2к+. В общем тогда пока попробую в кз мод интегрировать тем же способом, что и @s1lent, т.к. мне по сути подходит телепортировать игрока на КТ спавн, а не создавать Теровский, в крайнем случае добавлю других событий ивентов, которые смогли бы спровоцировать спавн игрока (помимо уже зарегистрированного - СМЕРТИ)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Цитата

new iszClassNameTT = engfunc(EngFunc_AllocString, "info_player_deathmatch")
  
iEnt = engfunc(EngFunc_CreateNamedEntity, iszClassNameTT)
DispatchKeyValueCustom(iEnt, "angles", mTempDatas[m_szAngles])
DispatchKeyValueCustom(iEnt, "origin", mTempDatas[m_szOrigins])
dllfunc(DLLFunc_Spawn, iEnt)

 

эти действия были проведены в plugin_precache?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Medusa вот пробуй

 

kz_auto_add_spawns.sma

 


Добавил создание ТТ спавна на месте СТ спавна (рандомно).

1

Я уже редко бываю в интернете...:dance2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Vaqtincha Спасибо ) но я реализовал уже в кридз майн моде это, но для интереса решил тестануть, и все равно кидает на таких мапах на 0 0 0 координаты при респауне  за тера, в общем  х3  что не нравится игре с переносом самого спавна,  но через EngFunc_SetOrigin к id игрока, работает нормально :) спасибо за старание, мейби кому нибудь пригодится :з

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Medusa Я сам тестил лично и работало нормально!

 

Потестите кого-нибудь еще!

0

Я уже редко бываю в интернете...:dance2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу