Chcialbym mojemu bytowi ustawic taką kombinacje movetype oraz solid'a aby wykrywalo toucha, ale jednoczesnie nie kolidowalo z otoczeniem (noclip i trigger nie dzialaja.)
Jest to mozliwe ?
Użytkownik NoLiFeR edytował ten post 31.03.2015 00:06
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Najlepsza odpowiedź grankee, 31.03.2015 03:17
MOVETYPE_TOSS + SOLID_TRIGGER mi działał
Przejdź do postu
Napisano 30.03.2015 23:54
Chcialbym mojemu bytowi ustawic taką kombinacje movetype oraz solid'a aby wykrywalo toucha, ale jednoczesnie nie kolidowalo z otoczeniem (noclip i trigger nie dzialaja.)
Jest to mozliwe ?
Użytkownik NoLiFeR edytował ten post 31.03.2015 00:06
Napisano 31.03.2015 03:17 Najlepsza odpowiedź
MOVETYPE_TOSS + SOLID_TRIGGER mi działał
Napisano 31.03.2015 07:20
#define SHOW_NAMES_WHEN_AIM
#define ENABLE_SHOTS_DAMAGE
#define SEMICLIP_RENDERING_RADIUS 400.0
// /* DON'T EDIT BELOW */
#include < amxmodx >
#include < engine >
#include < fakemeta >
#include < hamsandwich >
#pragma semicolon 1
#define PLUGIN "Team SemiClip"
#define AUTHORS "ConnorMcLeod"
new const VERSION[] = "0.4.0";
const Float:SEMICLIP_RADIUS = SEMICLIP_RENDERING_RADIUS;
const m_iTeam = 114;
const GROUP_OP_NAND = 1;
#define ENGINE_SETGROUPMASK(%0,%1) engfunc(EngFunc_SetGroupMask, %0, %1)
const groupNone = 0;
new const CLASS_PLAYER[] = "player";
new g_iMaxPlayers;
#define IsPlayer(%0) ( 1 <= (%0) <= g_iMaxPlayers )
#define MaskEnt(%0) ( 1<<(%0 & 31) )
new g_bitIsPlayerInSphere;
#define MarkPlayerInSphere(%0) g_bitIsPlayerInSphere |= MaskEnt(%0)
#define IsPlayerInSphere(%0) ( g_bitIsPlayerInSphere & MaskEnt(%0) )
new g_bitIsPlayerInTeam;
#define MarkPlayerInTeam(%0) g_bitIsPlayerInTeam |= MaskEnt(%0)
#define IsPlayerInTeam(%0) ( g_bitIsPlayerInTeam & MaskEnt(%0) )
new g_bitIsPlayerAlive;
#define MarkPlayerAlive(%0) g_bitIsPlayerAlive |= MaskEnt(%0)
#define IsPlayerAlive(%0) ( g_bitIsPlayerAlive & MaskEnt(%0) )
new g_bitBots;
#define MarkPlayerBot(%0) g_bitBots |= MaskEnt(%0)
#define ClearPlayerBot(%0) g_bitBots &= ~MaskEnt(%0)
#define IsUserBot(%0) ( g_bitBots & MaskEnt(%0) )
new g_bitSeeingPlayers;
#define MarkPlayerSee(%0) g_bitSeeingPlayers |= MaskEnt(%0)
#define ClearPlayerSee(%0) g_bitSeeingPlayers &= ~MaskEnt(%0)
#define IsPlayerSeeing(%0) ( g_bitSeeingPlayers & MaskEnt(%0) )
#define TogglePlayerSeeing(%0) g_bitSeeingPlayers ^= MaskEnt(%0)
new g_iPlayers[32], g_iNum;
new g_iLastPlayerIndex;
new g_iFhAddToFullPackPost;
new bool:g_bReadPackets;
new bool:g_bClientMessages;
#if defined SHOW_NAMES_WHEN_AIM
new HamHook:g_iHhPreThink, HamHook:g_iHhPreThinkPost, bool:g_bPreThinkHooked;
#endif
#if defined ENABLE_SHOTS_DAMAGE
new HamHook:g_iHhPostThink, HamHook:g_iHhPostThinkPost, bool:g_bPostThinkHooked;
#endif
public plugin_init()
{
register_plugin( PLUGIN, VERSION, AUTHORS );
register_forward(FM_CmdStart, "OnCmdStart_P", true);
#if defined SHOW_NAMES_WHEN_AIM
DisableHamForward( g_iHhPreThink = RegisterHam(Ham_Player_PreThink, CLASS_PLAYER, "OnCBasePlayer_PreThink", false) );
DisableHamForward( g_iHhPreThinkPost = RegisterHam(Ham_Player_PreThink, CLASS_PLAYER, "OnCBasePlayer_PreThink_P", true) );
#endif
#if defined ENABLE_SHOTS_DAMAGE
DisableHamForward( g_iHhPostThink = RegisterHam(Ham_Player_PostThink, CLASS_PLAYER, "OnCBasePlayer_PostThink", false) );
DisableHamForward( g_iHhPostThinkPost = RegisterHam(Ham_Player_PostThink, CLASS_PLAYER, "OnCBasePlayer_PostThink_P", true) );
#endif
RegisterHam(Ham_Spawn, CLASS_PLAYER, "OnCBasePlayer_Spawn_P", true);
RegisterHam(Ham_Killed, CLASS_PLAYER, "OnCBasePlayer_Killed_P", true);
register_forward(FM_UpdateClientData, "OnUpdateClientData_P", true);
g_iMaxPlayers = get_maxplayers();
}
public client_putinserver(id)
{
if( is_user_bot(id) )
{
MarkPlayerBot(id);
}
else
{
ClearPlayerBot(id);
}
MarkPlayerSee(id);
}
public OnCmdStart_P(id)
{
if( !g_bReadPackets )
{
g_bReadPackets = true;
static plr;
get_players g_iPlayers, g_iNum, "a" ;
for(--g_iNum; g_iNum>=0; g_iNum--)
{
plr = g_iPlayers[ g_iNum ];
entity_set_int plr, EV_INT_groupinfo, get_pdata_int(plr, m_iTeam) ;
}
g_iLastPlayerIndex = 0;
}
if( g_iLastPlayerIndex && is_user_alive(g_iLastPlayerIndex) )
{
entity_set_int g_iLastPlayerIndex, EV_INT_groupinfo, get_pdata_int(g_iLastPlayerIndex, m_iTeam) ;
}
if( is_user_alive(id) )
{
static group;
group = get_pdata_int(id, m_iTeam);
entity_set_int id, EV_INT_groupinfo, group ;
ENGINE_SETGROUPMASK(group, GROUP_OP_NAND);
if( IsPlayerSeeing(id) )
{
#if defined SHOW_NAMES_WHEN_AIM
if( !g_bPreThinkHooked )
{
EnableHamForward g_iHhPreThink ;
EnableHamForward g_iHhPreThinkPost ;
g_bPreThinkHooked = true;
}
#endif
#if defined ENABLE_SHOTS_DAMAGE
if( !g_bPostThinkHooked )
{
EnableHamForward g_iHhPostThink ;
EnableHamForward g_iHhPostThinkPost ;
g_bPostThinkHooked = true;
}
#endif
}
else // empty statement when nothing is defined ?
{
#if defined SHOW_NAMES_WHEN_AIM
if( g_bPreThinkHooked )
{
DisableHamForward g_iHhPreThink ;
DisableHamForward g_iHhPreThinkPost ;
g_bPreThinkHooked = false;
}
#endif
#if defined ENABLE_SHOTS_DAMAGE
if( g_bPostThinkHooked )
{
DisableHamForward g_iHhPostThink ;
DisableHamForward g_iHhPostThinkPost ;
g_bPostThinkHooked = false;
}
#endif
}
}
else
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
g_iLastPlayerIndex = id;
#if defined SHOW_NAMES_WHEN_AIM
if( g_bPreThinkHooked )
{
DisableHamForward g_iHhPreThink ;
DisableHamForward g_iHhPreThinkPost ;
g_bPreThinkHooked = false;
}
#endif
#if defined ENABLE_SHOTS_DAMAGE
if( g_bPostThinkHooked )
{
DisableHamForward g_iHhPostThink ;
DisableHamForward g_iHhPostThinkPost ;
g_bPostThinkHooked = false;
}
#endif
}
return FMRES_IGNORED;
}
public OnCBasePlayer_PreThink(id)
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
return HAM_IGNORED;
}
public OnCBasePlayer_PreThink_P(id)
{
entity_set_int id, EV_INT_groupinfo, get_pdata_int(id, m_iTeam) ;
return HAM_IGNORED;
}
public OnCBasePlayer_PostThink(id)
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
return HAM_IGNORED;
}
public OnCBasePlayer_PostThink_P(id)
{
entity_set_int id, EV_INT_groupinfo, get_pdata_int(id, m_iTeam) ;
return HAM_IGNORED;
}
public OnCBasePlayer_Spawn_P(id)
{
if( is_user_alive(id) )
{
entity_set_int id, EV_INT_groupinfo, get_pdata_int(id, m_iTeam) ;
}
return HAM_IGNORED;
}
public OnCBasePlayer_Killed_P(id)
{
if( !is_user_alive(id) )
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
}
return HAM_IGNORED;
}
// maybe this could be moved to first UpdateClientData ??
// in any ways, SV_Physics gonna be executed with clipping players
public server_frame()
{
g_iLastPlayerIndex = 0;
g_bReadPackets = false;
g_bClientMessages = false;
static id;
get_players g_iPlayers, g_iNum, "a" ;
for(--g_iNum; g_iNum>=0; g_iNum--)
{
id = g_iPlayers[ g_iNum ];
entity_set_int id, EV_INT_groupinfo, 0 ;
}
return FMRES_IGNORED;
}
public OnUpdateClientData_P(id, sendweapons, cd)
{
if( IsUserBot(id) )
{
return FMRES_IGNORED;
}
if( !g_bClientMessages )
{
g_bClientMessages = true;
g_bitIsPlayerAlive = 0;
get_players g_iPlayers, g_iNum, "a" ;
for(--g_iNum; g_iNum>=0; g_iNum--)
{
MarkPlayerAlive( g_iPlayers[ g_iNum ] ); // safe to cache alive players here because nobody can die/spawn during rendering
}
}
if( IsPlayerAlive(id) )
{
if( IsPlayerSeeing(id) )
{
static player;
g_bitIsPlayerInTeam = 0;
get_players g_iPlayers, g_iNum, "ae", get_pdata_int(id, m_iTeam) == 1 ? "TERRORIST" : "CT" ;
for(--g_iNum; g_iNum>=0; g_iNum--)
{
player = g_iPlayers[ g_iNum ];
if( player != id )
{
MarkPlayerInTeam( player );
}
}
g_iNum = find_sphere_class(id, CLASS_PLAYER, SEMICLIP_RADIUS, g_iPlayers, g_iMaxPlayers);
g_bitIsPlayerInSphere = 0;
for(--g_iNum; g_iNum>=0; g_iNum--)
{
player = g_iPlayers[ g_iNum ];
if( player != id && IsPlayerInTeam( player ) )
{
MarkPlayerInSphere( player );
}
}
if( g_bitIsPlayerInSphere )
{
if( !g_iFhAddToFullPackPost )
{
g_iFhAddToFullPackPost = register_forward(FM_AddToFullPack, "OnAddToFullPack_P", true);
}
}
else if( g_iFhAddToFullPackPost )
{
unregister_forward FM_AddToFullPack, g_iFhAddToFullPackPost, true ;
g_iFhAddToFullPackPost = 0;
}
}
else if( g_iFhAddToFullPackPost )
{
unregister_forward FM_AddToFullPack, g_iFhAddToFullPackPost, true ;
g_iFhAddToFullPackPost = 0;
}
}
return FMRES_IGNORED;
}
public OnAddToFullPack_P(es, e, ent, id, hostflags, player, pSet)
{
if( player )
{
if( IsPlayerAlive(ent) && IsPlayerInSphere(ent) )
{
set_es es, ES_Solid, SOLID_NOT ;
set_es es, ES_RenderMode, kRenderTransAlpha ;
set_es es, ES_RenderAmt, floatround(entity_range(id, ent) * 255.0 / SEMICLIP_RADIUS, floatround_floor) ;
}
}
else
{
unregister_forward FM_AddToFullPack, g_iFhAddToFullPackPost, true ;
g_iFhAddToFullPackPost = 0;
}
}
Napisano 31.03.2015 11:17
To ma dzialac na enty, ale wykorzystam powyzszy kod do czegos innego. grankee dzięki dziala. Mozna zamknac.
0 użytkowników, 1 gości, 0 anonimowych