OFFSprings
Участник
- Сообщения
- 14
- Реакции
- 0
Мне хотелось бы узнать что нибудь о применении логических операторов в Sourcepawn.
Мне хотелось бы узнать что нибудь о применении логических операторов в Sourcepawn.
Меня чувак учит программировать ,он мне дал задание написать плагин который прибавляет хп так,OFFSprings, какие конкретно?
http://forum.sourcemod-plugins.ru/forum/threads/osnovy-logiki-sourcepawn.19/
Там в конце темы.
bool jumpmax=false;
#include <sourcemod>
public OnPluginStart()
{
HookEvent("player_jump",OnPlayerJump);
}
public Action:OnPlayerJump(Handle:event,const String:name[],bool dontBroadcast)
{
int client=GetClientOfUserId(GetEventInt(event,"userid"));
int hp=GetClientHealth(client);
bool jumpmax=false;
int S=0;
S++;
SetEntityHealth(client,hp+S);
if (S==5 && jumpmax==false)
{
jumpmax=true;
SetEntityHealth(client,hp-1);
}
else if (S==0 && jumpmax==true)
{
jumpmax=false;
SetEntityHealth(client,hp+1);
}
}
Вот намутил.
Скомпилировался удачно.
Но мне кажется он и одновременно будет и присваивать хп другому клиенту.Хотя регистрация id идет при прыжке.PHP:#include <sourcemod> public OnPluginStart() { HookEvent("player_jump",OnPlayerJump); } public Action:OnPlayerJump(Handle:event,const String:name[],bool dontBroadcast) { int client=GetClientOfUserId(GetEventInt(event,"userid")); int hp=GetClientHealth(client); bool jumpmax=false; int S=0; S++; SetEntityHealth(client,hp+S); if (S==5 && jumpmax==false) { jumpmax=true; SetEntityHealth(client,hp-1); } else if (S==0 && jumpmax==true) { jumpmax=false; SetEntityHealth(client,hp+1); } } [/SPOILER]
Добавлено через 10 минут
Исправил.
#include <sourcemod>
new bool: g_bJumpMax = false;
new g_iS = 0;
public OnPluginStart()
{
HookEvent("player_jump",OnPlayerJump);
}
public Action:OnPlayerJump(Handle:hEvent,const String:sName[],bool bDontBroadcast)
{
new iClient = GetClientOfUserId(GetEventInt(hEvent,"userid"));
new iHp = GetClientHealth(iClient);
if (g_iS < 4 && g_bJumpMax == false)
{
SetEntityHealth(iClient,iHp++);
g_iS++;
if(g_iS == 4)
{
g_bJumpMax = true;
}
}
else if (g_iS > 4 && g_bJumpMax == true)
{
SetEntityHealth(iClient,iHp--);
g_iS--;
if(g_iS == 0)
{
g_bJumpMax = false;
}
}
} [/SPOILER]
loginivan а если хп будет 63?
Разве что для реверса:нужно использовать глобальные переменные для каждого игрока
#include <sourcemod>
bool g_bReverse[MAXPLAYERS+1];
public OnPluginStart() HookEvent("player_jump", OnPlayerJump);
public OnPlayerJump(Handle:event,const String:name[],bool dontBroadcast)
{
int client=GetClientOfUserId(GetEventInt(event,"userid")), hp=GetClientHealth(client);
SetEntityHealth(client, g_bReverse[client] ? (g_bReverse[client] = hp < 105) ? hp+1:hp-1:(g_bReverse[client] = hp <= 100) ? hp+1:hp-1);
}
Это и имел ввиду. А вообще тз не понятное для меня.Разве что для реверса:
Декомпильни этот код и увидишь что лепить в 1 строку не имеет смысла. К тому же создаются лишние переменные.SetEntityHealth(client, g_bReverse[client] ? (g_bReverse[client] = hp < 105) ? hp+1:hp-1:(g_bReverse[client] = hp <= 100) ? hp+1:hp-1);
Оффтоплепить в 1 строку не имеет смысла
#include <sourcemod>
bool g_bReverse[MAXPLAYERS+1];
public OnPluginStart() HookEvent("player_jump", OnPlayerJump);
public OnPlayerJump(Handle:event,const String:name[],bool dontBroadcast)
{
int client=GetClientOfUserId(GetEventInt(event,"userid")), hp=GetClientHealth(client);
SetEntityHealth(client, g_bReverse[client] && (g_bReverse[client] = hp < 105) || (g_bReverse[client] = hp <= 100) ? hp+1:hp-1);
}
#include <sourcemod>
bool g_bReverse[MAXPLAYERS+1];
public OnPluginStart() HookEvent("player_jump", OnPlayerJump);
public OnPlayerJump(Handle:event,const String:name[],bool dontBroadcast)
{
int client=GetClientOfUserId(GetEventInt(event,"userid")), hp=GetClientHealth(client);
SetEntityHealth(client, (g_bReverse[client] = g_bReverse[client] && hp < 105 || hp <= 100) ? hp+1:hp-1);
}
Если более 105, то будет снижать с каждым прыжком до 100, а потом поднимать до 105 и обратно.
Если менее 100, то поднимет до 105, далее - по циклу.
В коде чётко обозначен нужный диапазон в виде цифр 100 и 105. ОффтопПугни этим скриптера - быстро разберётся или нет. :-D
if (iHp < 105 && bJumpMax == false)
{
SetEntityHealth(iClient,iHp++);
if(iHp == 105)
{
bJumpMax = true;
}
}
else if (iHp > 100 && bJumpMax == true)
{
SetEntityHealth(iClient,iHp--);
if(iHp == 100)
{
bJumpMax = false;
}
}
Выглядит плохо. Как минимум, это сделано, как если бы играл всего 1 игрок на сервере, не более. Будет 2 и больше, то будут учтены чужие прыжки.изначально так и делал