Вопросы по: MySql/Sql & Логике & EmitSound & Координаты

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Всем привет!

Вопрос №1:
Как это сделать для MySql:
SaveClient(client)
PHP:
SaveClient(client)
{
	if (client && !IsFakeClient(client) && !IsClientSourceTV(client))
	{
		decl String:sQuery[250];
		GetClientAuthString(client, sQuery, 32);
		Format(sQuery, sizeof(sQuery), "UPDATE new_mod_table SET `exp` = '%d', `kills` = '%d', `deaths` = '%d', `level` = '%d',`credits` = '%d' WHERE `steamid`='%s' LIMIT 1",g_iExp[client],g_iKills[client],g_iDeaths[client],g_iLevel[client],g_iCredits[client], sQuery);
		SQL_TQuery(g_hSQL, SQLT_OnClientSave, sQuery, GetClientUserId(client));
	}
}
public SQLT_OnClientSave(Handle:hOwner, Handle:hQuery, const String:sError[], any:iUserId)
{
	new iClient = GetClientOfUserId(iUserId);
	if (!iClient)
	{
		return;
	}
	
	if (!hQuery)
	{
		LogError("SQLT_OnInsertClient: %s", sError);
	}
	g_bIsLoad[iClient] = false;
}

Вопрос №2:
Какой будет этот код для MySql:
OnClientLoad(client)
PHP:
OnClientLoad(client)
{
	if (client && !IsFakeClient(client) && !IsClientSourceTV(client))
	{
		decl String:sQuery[250];
		GetClientAuthString(client, sQuery, 32);
		Format(sQuery, sizeof(sQuery), "SELECT `exp`, `kills`, `deaths`, `level`,`credits` FROM `new_mod_table` WHERE `steamid`='%s' LIMIT 1", sQuery);
		SQL_TQuery(g_hSQL, SQLT_OnClientPutInServer, sQuery, GetClientUserId(client));
	}
}

public SQLT_OnClientPutInServer(Handle:hOwner, Handle:hQuery, const String:sError[], any:iUserId)
{
	new iClient = GetClientOfUserId(iUserId);
	if (!iClient)
	{
		return;
	}
	
	if (!hQuery)
	{
		LogError("SQLT_OnClientPutInServer: %s", sError);
		g_bIsLoad[iClient] = false;
	}
	
	if (SQL_FetchRow(hQuery))
	{
		g_iExp[iClient] = SQL_FetchInt(hQuery, 0);
		g_iKills[iClient] = SQL_FetchInt(hQuery, 1);
		g_iDeaths[iClient] = SQL_FetchInt(hQuery, 2);
		g_iLevel[iClient] = SQL_FetchInt(hQuery, 3);
		g_iCredits[iClient] = SQL_FetchInt(hQuery, 4);
		g_bIsLoad[iClient] = true;
	}
	else
	{
		decl String:sQuery[250];
		GetClientAuthString(iClient, sQuery, 32);
		Format(sQuery, 650, "INSERT INTO `new_mod_table` (`exp`,`kills`,`deaths`,`level`,`credits`,`steamid`) VALUES (0,0,0,1,0,'%s')", sQuery);
		SQL_TQuery(g_hSQL, SQLT_OnInsertClient, sQuery, GetClientUserId(iClient));
	}
}
public SQLT_OnInsertClient(Handle:hOwner, Handle:hQuery, const String:sError[], any:iUserId)
{
	new iClient = GetClientOfUserId(iUserId);
	if (!iClient)
	{
		return;
	}
	
	if (!hQuery)
	{
		LogError("SQLT_OnInsertClient: %s", sError);
		g_bIsLoad[iClient] = false;
	}
	g_bIsLoad[iClient] = true;
	g_iExp[iClient] = g_iExpStart;
	g_iKills[iClient] = 0;
	g_iDeaths[iClient] = 0;
	g_iLevel[iClient] = 1;
	g_iCredits[iClient] = g_iCreditsStart;
}

Вопрос №3:
Как воспроизвести звук (acegamer/pain/men/pain04.mp3) в радиусе от игрока и чем дальше тем тише.
PHP:
				new Float:pos_c[3], String:buf[256];
				GetClientAbsOrigin(client, Float:pos_c);

				for(new i=1;i<=MaxClients;i++)
				{
					if(IsClientInGame(i) && IsPlayerAlive(i))
						EmitAmbientSound("acegamer/pain/men/pain04.mp3" , Float:pos_c, client, SNDLEVEL_CONVO );
				}
Вопрос №4:
Почему не добавляет g_iCredits , g_iLevel , g_iExp ? Вроде всё правильно сделал.
PHP:
/*
"userid"	"short"   	// user ID who died				
"attacker"	"short"	 	// user ID who killed
"weapon"	"string" 	// weapon name killer used 
"headshot"	"bool"		// signals a headshot
*/
public Action:EV_Death(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event,"userid")),
		attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
		
	if(client && attacker /*&& !IsFakeClient(client) && !IsFakeClient(attacker)*/)
	{
		new bHead = GetEventBool(event,"headshot");
		
		g_iKills[attacker]++;
		g_iDeaths[client]++;
		
		g_iCredits[attacker]=g_iCredits[attacker]+((bHead)?g_iCreditsHead:g_iCreditsKill);
		
		new newxp=g_iExp[attacker]+((bHead)?g_iExpHead:g_iExpKill);
		if(newxp>=(g_iLevel[attacker]*g_iExpInc))
		{
			
			new newlevel=0;
			new reqxp = g_iLevel[attacker]*g_iExpInc;
			while(g_iExp[attacker]>reqxp)
			{
				newxp-=reqxp;
				newlevel = g_iLevel[attacker] + 1;
			}
			// while(newxp<0)
			// {
				// g_iLevel[attacker]-=1;
				// newxp=reqxp-g_iExpInc-newxp;
			// }
			g_iLevel[attacker] = newlevel;
			g_iExp[attacker] = newxp;
			PrintToChat(attacker,"[New Mod] Вы получили:");
			PrintToChat(attacker,"Новый уровень %d",g_iLevel[attacker]);
			PrintToChat(attacker,"Теперь у вас %d EXP",g_iExp[attacker]);
		}
	}
}

P.S. Знаю что вопросы глупые и наверняка есть ответы в сети, но мне не понятно то что я нашёл в сети. :blush2: Помогите.
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
Re: Вопросы по: MySql/Sql & Логике & EmitSound

Саша Шеин, 1. Это одинаково для sql и mysql
2. Смотри 1.
3. Сам же ответил на свой вопрос - EmitAmbientSound
Только не в цикле:
PHP:
decl Float:pos_c[3]; 
GetClientAbsOrigin(client, Float:pos_c); 
EmitAmbientSound("acegamer/pain/men/pain04.mp3" , pos_c, client);
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Re: Вопросы по: MySql/Sql & Логике & EmitSound

R1KO, а четыре? Теперь пишет:
[New Mod] Вы получили:
Новый уровень 0
Теперь у вас 100 EXP

И вовремя убийства подлагивает.

Добавлено через 57 секунд
1. Это одинаково для sql и mysql
А оно вообще правильно написано?
 
Последнее редактирование:

NeXxX

Участник
Сообщения
312
Реакции
26
Re: Вопросы по: MySql/Sql & Логике & EmitSound

Эй Сашка ты что задумал?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
Re: Вопросы по: MySql/Sql & Логике & EmitSound

А оно вообще правильно написано?
PHP:
public SQLT_OnClientSave(Handle:hOwner, Handle:hQuery, const String:sError[], any:iUserId)
{
    new iClient = GetClientOfUserId(iUserId);
    if (!iClient)
    {
        return;
    }
    
    if (!hQuery)
    {
        LogError("SQLT_OnInsertClient: %s", sError);
    }
    g_bIsLoad[iClient] = false;
}
Поменяй местами. А то если игрок станетне валиден но будет ошибка - её в логе не будет.

PHP:
public SQLT_OnClientPutInServer(Handle:hOwner, Handle:hQuery, const String:sError[], any:iUserId)
{
    new iClient = GetClientOfUserId(iUserId);
    if (!iClient)
    {
        return;
    }
    
    if (!hQuery)
    {
        LogError("SQLT_OnClientPutInServer: %s", sError);
        g_bIsLoad[iClient] = false;
    }

Тут тоже

PHP:
 new iClient = GetClientOfUserId(iUserId);
    if (!iClient)
    {
        return;
    }
    
    if (!hQuery)
    {
        LogError("SQLT_OnInsertClient: %s", sError);
        g_bIsLoad[iClient] = false;
    }

Ну и тут


PHP:
 decl String:sQuery[250];
        GetClientAuthString(iClient, sQuery, 32);
        Format(sQuery, 650, "INSERT INTO `new_mod_table` (`exp`,`kills`,`deaths`,`level`,`credits`,`steamid`) VALUES (0,0,0,1,0,'%s')", sQuery);
Ничего что размер sQuery 250, а ты указываешь 650.

Про 4 вк написал ответ.
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Re: Вопросы по: MySql/Sql & Логике & EmitSound

PHP:
L 10/22/2015 - 18:42:53: [SM] Plugin encountered error 30: Script execution timed out
L 10/22/2015 - 18:42:53: [SM] Displaying call stack trace for plugin "mod.smx":
L 10/22/2015 - 18:42:53: [SM]   [0]  Line 84, mod.sp::EV_Death()
L 10/22/2015 - 18:43:37: [SM] Plugin encountered error 30: Script execution timed out
L 10/22/2015 - 18:43:37: [SM] Displaying call stack trace for plugin "mod.smx":
L 10/22/2015 - 18:43:37: [SM]   [0]  Line 84, mod.sp::EV_Death()
L 10/22/2015 - 18:43:43: Error log file session closed.

PHP:
public Action:EV_Death(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event,"userid")),
		attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
		
	if(client && attacker /*&& !IsFakeClient(client) && !IsFakeClient(attacker)*/)
	{
		new bHead = GetEventBool(event,"headshot");
		
		g_iKills[attacker]++;
		g_iDeaths[client]++;
		
		g_iCredits[attacker]=g_iCredits[attacker]+((bHead)?g_iCreditsHead:g_iCreditsKill);
		
		new newxp=g_iExp[attacker]+((bHead)?g_iExpHead:g_iExpKill);
		if(newxp>=(g_iLevel[attacker]*g_iExpInc))
		{
			
			new newlevel=0;
			new reqxp = g_iLevel[attacker]*g_iExpInc;
			while(g_iExp[attacker]>reqxp)
			{
				newxp-=reqxp;
				newlevel = g_iLevel[attacker] + 1; // 84
			}
			while(newxp<0)
			{
				newlevel-=1;
				newxp=reqxp-g_iExpInc-newxp;
			}
			g_iLevel[attacker] = newlevel;
			g_iExp[attacker] = newxp;
			PrintToChat(attacker,"[New Mod] Вы получили:");
			PrintToChat(attacker,"Новый уровень %d",g_iLevel[attacker]);
			PrintToChat(attacker,"Теперь у вас %d EXP",g_iExp[attacker]);
		}
	}
}
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
Re: Вопросы по: MySql/Sql & Логике & EmitSound

Саша Шеин, с циклами напартачил
 

rom4s

Не понимает, что происходит &nbsp;
Сообщения
214
Реакции
194
Re: Вопросы по: MySql/Sql & Логике & EmitSound

PHP:
			new newlevel=0;
			new reqxp = g_iLevel[attacker]*g_iExpInc;
			while(g_iExp[attacker]>reqxp)
			{
				newxp-=reqxp;
				newlevel = g_iLevel[attacker] + 1; // 84
			}
			// ...
			g_iLevel[attacker] = newlevel;
			g_iExp[attacker] = newxp;
Интересный у вас цикл, вы сравниваете g_iExp[attacker] и reqxp, но при этом с ними ничего не делаете.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #11
Re: Вопросы по: MySql/Sql & Логике & EmitSound

Саша Шеин, ты кажется вообще вечный цикл запускаешь.
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Re: Вопросы по: MySql/Sql & Логике & EmitSound

Да цикл непрерывный получился :)
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Всем привет!

Вопрос по координатам:
1) Как изменить направление прицела у игрока, то есть я создал entity и надо сделать так, чтобы игрок начал смотреть на неё, но если только он её видит, очень прошу объяснить кодом, т.к. с координатами не умею работать!?

2) Как изменить конечную точку выстрела, но не визуально, а реально?

3) Надо создать 5+ ентити, в радиусе от точки, но есть шансы что ентити окажется в стенке или за стенкой, как это избежать?
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
1. Получаем координаты обоих сущностей, проверяем, видит ли игрок эту сущность.
C-подобный:
bool:IsVisible(iClient, iEntity)
{
    decl Float:vClientEye[3], Float:vEntityOrigin[3];
    GetClientEyePosition(iClient, vClientEye);
    GetEntPropVector(iEntity, Prop_Data, "m_vecOrigin", vEntityOrigin);
    TR_TraceRayFilter(vClientEye, vEntityOrigin, MASK_VISIBLE, RayType_EndPoint, Filter_NoPlayers);
    return (TR_GetFraction() == 1.0);
}

public bool:Filter_NoPlayers(iEntity, iMask)
{
    return (iEntity <= 0 || iEntity > MaxClients);
}
Для того, чтобы игрок стал смотреть куда нам нужно, нужно изменить его угол. Для этого надо получить координаты сущностей, из двух точек можно образовать вектор, а вот углы вектора как раз будут тем углами, которые нужно установить игроку.
C-подобный:
ForceLook(iClient, iEntity)
{
    decl Float:vClientEye[3], Float:vEntityOrigin[3];
    GetClientEyePosition(iClient, vClientEye);
    GetEntPropVector(iEntity, Prop_Data, "m_vecOrigin", vEntityOrigin);
    
    decl Float:vDirection[3], Float:vDirectionAngle[3];
    MakeVectorFromPoints(vClientEye, vEntityOrigin, vDirection);
    GetVectorAngles(vDirection, vDirectionAngle);
    
    TeleportEntity(iClient, NULL_VECTOR, vDirectionAngle, NULL_VECTOR);
}
2. Вряд ли это возможно. Можно лишь изменить разбор оружия либо его отдачу.

3. Генерируем случайный угол. Делаем из нужной точки TraceRay, получаем координаты препятствия по этому углу. Итого получаем дистанцию от точки до первого препятствия. Зная углы вектора, начальную и конечную точку, можно найти любую точку на этой прямой. Добавляем некие константы, если создаваемый объект не может быть создан в стене или в начальной точке (в примере код не дает создавать объект ближе чем 20.0 юнитов от начальной точки.
C-подобный:
public OnPluginStart() 
{
    RegConsoleCmd("sm_randomspawn", Command_RandomSpawn);
}

public OnMapStart() 
{
    g_iLightningSprite = PrecacheModel("sprites/lgtning.vmt");  
    g_iGlowSprite = PrecacheModel("materials/sprites/blueflare1.vmt");
}

public Action:Command_RandomSpawn(iClient, iArgs)
{
    decl Float:vOrigin[3], Float:vAngles[3], Float:vEndOrigin[3];
    GetClientEyePosition(iClient, vOrigin);
    GetClientEyeAngles(iClient, vAngles);
    vAngles[0] += GetRandomFloat(-45.0, 45.0);
    vAngles[1] += GetRandomFloat(-45.0, 45.0);
    vAngles[2] += GetRandomFloat(-45.0, 45.0);
    
    GetViewOrigin(iClient, vOrigin, vAngles, vEndOrigin);
    TE_SetupBeamPoints(vOrigin, vEndOrigin, g_iLightningSprite, g_iLightningSprite, 0, 24, 2.0, 3.0, 3.0, 1, 0.0, {255, 0, 0, 255}, 1);
    TE_SendToAll();
    
    decl Float:vDirection[3], Float:vDistance;
    vDistance = GetVectorDistance(vOrigin, vEndOrigin);
    if ( vDistance >= 20.0 ) {
        GetAngleVectors(vAngles, vDirection, NULL_VECTOR, NULL_VECTOR);
        ScaleVector(vDirection, GetRandomFloat(20.0, vDistance));
        AddVectors(vOrigin, vDirection, vOrigin);
        
        TE_SetupGlowSprite(vOrigin, g_iGlowSprite, 2.0, 1.0, 255);
        TE_SendToAll();
    }
    else {
        Command_RandomSpawn(iClient, 0);
    }
    
    return Plugin_Handled;
}

bool:GetViewOrigin(iClient, Float:vOrigin[3], Float:vAngles[3], Float:vEndOrigin[3])
{
    TR_TraceRayFilter(vOrigin, vAngles, MASK_SOLID, RayType_Infinite, TR_DontHitSelf, iClient);
    if ( TR_DidHit(INVALID_HANDLE) )
    {
        TR_GetEndPosition(vEndOrigin, INVALID_HANDLE);
    }
}

public bool TR_DontHitSelf(int iEntity, int iMask, any iData) { return ( iEntity != iData ); }
Код создается на красной линии светящуюся белую точку. Если нужно, чтобы объект создавался на полу, а не в воздухе, то нужно будет опустить перпендикуляр вниз из найденной случайной точки.

К посту прикладываю два файла - полные исходники к этим плагинам. Первый по команде sm_forcelook <entity> устанавливает прицел на неё, если эта сущность видна, второй по команде sm_randomspawn создает линию и светящуюся белую точку в случайной позиции на этой линии.
 

Вложения

  • look_at_entity.sp
    1.6 КБ · Просмотры: 6
  • random_spawn_entity.sp
    2 КБ · Просмотры: 7

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Re: Вопросы по: MySql/Sql & Логике & EmitSound & Координаты & Работа с объектами

Здравствуйте, подскажите как поправить данный код, чтобы объект спавнился и падал вниз?
PHP:
 CreateEnt(client,Float:pos[3])
{
 //new iEntity = CreateEntityByName("prop_dynamic_override");
  new iEntity = CreateEntityByName("prop_physics_multiplayer");
 if (IsValidEdict(iEntity))
 {
  DispatchKeyValue(iEntity, "solid", "6");
  /* ДВИГАЕТСЯ */
   DispatchKeyValue( iEntity, "physicsmode", "2");
   DispatchKeyValue( iEntity , "massScale", "1.0");
   /* *** */
  if (mdls[2][0])DispatchKeyValue(iEntity, "model", mdls[2]);
  DispatchSpawn(iEntity);
   
  SetEntProp(iEntity, Prop_Send, "m_usSolidFlags", 8);
  SetEntProp(iEntity, Prop_Send, "m_CollisionGroup", 1);
  SetEntityMoveType(iEntity, MOVETYPE_NONE);
  TeleportEntity(iEntity, pos, NULL_VECTOR, NULL_VECTOR);
  SetEntityRenderMode(iEntity, RENDER_TRANSCOLOR); 
  SetEntityRenderColor(iEntity,255,0,0,255); 
  EmitAmbientSound(sound_hk, pos, iEntity);
  decl String:buf[30];
  Format(buf, 30, "OnUser1 !self:kill::%1.f:-1", float(data_hk[0]));
  SetVariantString(buf);
  AcceptEntityInput(iEntity, "AddOutput");
  AcceptEntityInput(iEntity, "FireUser1");
  SDKHook(iEntity, SDKHook_EndTouch, Hook_EndTouch);
  SDKHook(iEntity, SDKHook_StartTouch, Hook_StartTouch);
  SetNeon(iEntity);
  CreateTimer(float(data_hk[0]), DeleteParticles, client);
 }
}
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Что означает данное выражение?

PHP:
new home = to = 4; // to и home это числа (например to равно пяти)
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
Саша Шеин, думаю будет 4 у всех. Лучше проведи тест, выведи эти значения в чат когда назначаешь.
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Здравствуйте, подскажите как шагнуть на уровень ниже.

Есть функция, например, CreateDir, как сдать директорию не рядом с addons, а ниже, рядом с csgo / cstrike папками. И вообще возможно ли это...

Заранее спасибо!
 
Сверху Снизу