NeLifeASkazka
Участник
- Сообщения
- 128
- Реакции
- 70
Всем привет
Вот код:
Пытаюсь сделать чтобы 1 игроку показывало направление где находится другой игрок спрайтом
Но есть проблема с SetTransmit
Когда спрайту устанавливается AcceptEntityInput(ent, "SetParent", client), тогда SetTransmit работает исправно, и спрайты видит только 1 игрок:
return iChosen != client ? Plugin_Handled : Plugin_Continue;
Но если не присваивать SetParent спрайту, тогда почему-то SDKHook "хукается", но не работает
В чем может быть проблема ?
Вот код:
code:
#pragma semicolon 1
#include <sdkhooks>
#include <sdktools>
#pragma newdecls required
int iSprite_ref[MAXPLAYERS+1];
int iChosen;
bool bInRange[MAXPLAYERS+1];
public void OnPluginStart(){
HookEvent("player_spawn", OnPlayer);
HookEvent("player_death", OnPlayer);
RegConsoleCmd("sm_test", cmd_test);
}
public Action cmd_test(int client, int args){
if(GetClientTeam(client) != 2) return Plugin_Continue;
iChosen = client;
return Plugin_Continue;
}
public void OnMapStart(){
PrecacheDecal("nlas/sprite/wh/wh_green.vmt", true);
AddFileToDownloadsTable("materials/nlas/sprite/wh/wh_green.vmt");
AddFileToDownloadsTable("materials/nlas/sprite/wh/wh_green.vtf");
CreateTimer(0.1, GlobalTimer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
public void OnClientDisconnect(int client){
DeleteSprite(client);
}
public void OnPlayer(Event event, const char[] name, bool dontBroadcast){
int client = GetClientOfUserId(event.GetInt("userid"));
if(client > 0 && client <= MaxClients && IsClientInGame(client)){
if(name[7] == 's'){
if(IsPlayerAlive(client) && GetClientTeam(client) == 3)
RequestFrame(rf_OnPlayerSpawn, client);
}
else {
DeleteSprite(client);
}
}
}
public void rf_OnPlayerSpawn(int client){
CreateSprite(client, false);
}
public Action GlobalTimer(Handle timer){
if(iChosen < 1 || !IsClientInGame(iChosen)) return Plugin_Continue;
float pos[3]; GetClientEyePosition(iChosen, pos);
float ang[3]; GetClientEyeAngles(iChosen, ang);
float dir[3], pos_target[3], pos_ent[3], client_dir[3], target_dir[3], temp[3];
for(int client = 1, ent; client <= MaxClients; client++){
if((ent = EntRefToEntIndex(iSprite_ref[client])) > 0 && IsValidEntity(ent) && IsClientInGame(client)){
GetClientEyePosition(client, pos_target);
if(GetVectorDistance(pos, pos_target) <= 1000.0){
if(!bInRange[client]){
bInRange[client] = true;
CreateSprite(client, true);
}
}
else{
if(bInRange[client]){
bInRange[client] = false;
CreateSprite(client, false);
// if(GetEntPropEnt(ent, Prop_Send, "moveparent") != -1)
// SetEntPropEnt(ent, Prop_Send, "moveparent", -1);
}
ang[0] = ang[2] = 0.0;
GetAngleVectors(ang, client_dir, NULL_VECTOR, NULL_VECTOR);
for(int x; x < 2; x++)
temp[x] = pos_target[x]-pos[x];
NormalizeVector(temp, target_dir);
if(GetVectorDotProduct(client_dir, target_dir) < 0.6) continue;
MakeVectorFromPoints(pos, pos_target, dir);
GetVectorAngles(dir, dir);
GetAngleVectors(dir, dir, NULL_VECTOR, NULL_VECTOR);
for(int x = 0; x < 2; x++)
pos[x] += dir[x] * 800.0;
GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos_ent);
if(pos[0] == pos_ent[0] && pos[1] == pos_ent[1]) continue;
TeleportEntity(ent, pos, NULL_VECTOR, NULL_VECTOR);
}
}
}
return Plugin_Continue;
}
public void CreateSprite(int client, bool parent){
DeleteSprite(client);
float pos[3]; GetClientEyePosition(client, pos);
int ent = CreateEntityByName("env_sprite");
DispatchKeyValue(ent, "model", "nlas/sprite/wh/wh_green.vmt");
DispatchKeyValueVector(ent, "origin", pos);
DispatchKeyValue(ent, "rendermode", "4");
DispatchKeyValue(ent, "scale", "0.4");
DispatchSpawn(ent);
if(parent){
SetVariantString("!activator");
AcceptEntityInput(ent, "SetParent", client);
}
SDKHook(ent, SDKHook_SetTransmit, OnSetTransmit);
iSprite_ref[client] = EntIndexToEntRef(ent);
}
public Action OnSetTransmit(int entity, int client){
PrintToChatAll("[%.2f] Transmit", GetGameTime());
return iChosen != client ? Plugin_Handled : Plugin_Continue;
}
stock void DeleteSprite(int client){
int ent;
if((ent = EntRefToEntIndex(iSprite_ref[client])) > 0 && IsValidEntity(ent))
AcceptEntityInput(ent, "kill");
}
Пытаюсь сделать чтобы 1 игроку показывало направление где находится другой игрок спрайтом
Но есть проблема с SetTransmit
Когда спрайту устанавливается AcceptEntityInput(ent, "SetParent", client), тогда SetTransmit работает исправно, и спрайты видит только 1 игрок:
return iChosen != client ? Plugin_Handled : Plugin_Continue;
Но если не присваивать SetParent спрайту, тогда почему-то SDKHook "хукается", но не работает
В чем может быть проблема ?