23/02/2015, 02:14 PM
(Última modificación: 23/02/2015, 02:14 PM por meTaLiCroSS.)
Ya que Mario me quizo cagar posteando sus cucarachas, les traigo las que habia hecho yo, y están muy bien educadas
Usen /roach en chat para spawnear una en frente de ustedes.
Código PHP:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <xs>
const ROACH_BLOOD = 195;
const Float:SPAWN_DISTANCE = 64.0;
const Float:ROACH_BASE_SPEED = 50.0;
new const MODEL_ROACH[] = "models/roach.mdl";
new const SOUND_ROACH_DIE[] = "roach/rch_smash.wav";
new const ROACH_CLASSNAME[] = "roach";
new const ROACH_REAL_CLASSNAME[] = "info_target";
new bool:g_bSomeRoachOnWorld;
new g_iBloodSpraySpriteId, g_iBloodDropSpriteId;
new HamHook:g_pKilledFwd, HamHook:g_pBloodColorFwd;
#define EV_VEC_roachprevpos EV_VEC_vuser1
#define EV_INT_roachflags EV_INT_weaponanim
#define EV_FL_nextroachdir EV_FL_fuser2
#define ROACH_LEFT (1<<22)
#define ROACH_IS (1<<23)
public plugin_init()
{
register_plugin("Roach AI", "0.1", "PM");
register_clcmd("say /roach", "ClientCommand_Roach");
register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
register_think(ROACH_CLASSNAME, "OnRoach_Think")
register_touch(ROACH_CLASSNAME, "*", "OnRoach_Touch")
g_bSomeRoachOnWorld = false
g_pKilledFwd = RegisterHam(Ham_Killed, ROACH_REAL_CLASSNAME, "OnRoach_Killed")
g_pBloodColorFwd = RegisterHam(Ham_BloodColor, ROACH_REAL_CLASSNAME, "OnRoach_BloodColor")
UpdateForwards();
}
public plugin_precache()
{
precache_model(MODEL_ROACH);
precache_sound(SOUND_ROACH_DIE);
g_iBloodSpraySpriteId = precache_model("sprites/bloodspray.spr")
g_iBloodDropSpriteId = precache_model("sprites/blood.spr")
}
public Event_RoundStart()
{
new iEntId = -1;
while( (iEntId = find_ent_by_class(iEntId, ROACH_CLASSNAME)) > 0 )
remove_entity(iEntId);
g_bSomeRoachOnWorld = false;
UpdateForwards();
}
public OnRoach_Think(iEntId)
{
if(!is_valid_ent(iEntId))
return;
static bool:bChangeAngles, Float:flCurrentTime, Float:vecTemp[3], Float:vecOrigin[3], Float:vecVelocity[3], Float:vecAngles[3]
entity_get_vector(iEntId, EV_VEC_origin, vecOrigin);
entity_get_vector(iEntId, EV_VEC_velocity, vecVelocity);
entity_get_vector(iEntId, EV_VEC_roachprevpos, vecTemp);
xs_vec_sub(vecOrigin, vecTemp, vecTemp);
bChangeAngles = false;
flCurrentTime = get_gametime();
if(xs_vec_len(vecTemp) < 1.0)
{
vecVelocity[0] = random_float(-ROACH_BASE_SPEED, ROACH_BASE_SPEED);
vecVelocity[1] = random_float(-ROACH_BASE_SPEED, ROACH_BASE_SPEED);
vector_to_angle(vecVelocity, vecAngles);
bChangeAngles = true;
}
else if(entity_get_int(iEntId, EV_INT_flags) & FL_ONGROUND)
{
static iFlags;
iFlags = entity_get_int(iEntId, EV_INT_roachflags);
vector_to_angle(vecVelocity, vecAngles);
bChangeAngles = true;
if(entity_get_float(iEntId, EV_FL_nextroachdir) < flCurrentTime)
{
entity_set_float(iEntId, EV_FL_nextroachdir, flCurrentTime + random_float(2.0, 5.0));
iFlags ^= ROACH_LEFT;
entity_set_int(iEntId, EV_INT_roachflags, iFlags)
}
vecAngles[1] += (iFlags & ROACH_LEFT) ? -3.0 : 3.0
angle_vector(vecAngles, ANGLEVECTOR_FORWARD, vecVelocity)
xs_vec_mul_scalar(vecVelocity, ROACH_BASE_SPEED, vecVelocity)
}
entity_set_vector(iEntId, EV_VEC_velocity, vecVelocity);
entity_set_vector(iEntId, EV_VEC_roachprevpos, vecOrigin);
if(bChangeAngles)
{
vecAngles[0] = 0.0;
vecAngles[2] = 0.0;
entity_set_vector(iEntId, EV_VEC_angles, vecAngles);
}
entity_set_float(iEntId, EV_FL_nextthink, flCurrentTime + 0.1);
}
public OnRoach_Touch(iEntId, iOtherId)
{
if(!is_valid_ent(iEntId))
return;
if(is_user_alive(iOtherId) && entity_get_edict(iOtherId, EV_ENT_groundentity) == iEntId)
{
new Float:vecStart[3], Float:vecDirection[3], Float:vecTarget[3]
entity_get_vector(iEntId, EV_VEC_origin, vecTarget)
entity_get_vector(iOtherId, EV_VEC_origin, vecStart)
UTIL_BloodDrips(vecTarget, ROACH_BLOOD, 5)
xs_vec_sub(vecTarget, vecStart, vecDirection)
xs_vec_normalize(vecDirection, vecDirection)
vecTarget[0] = vecStart[0] + (vecDirection[0] * 9999.0)
vecTarget[1] = vecStart[1] + (vecDirection[1] * 9999.0)
vecTarget[2] = vecStart[2] + (vecDirection[2] * 9999.0)
new iTr = create_tr2()
engfunc(EngFunc_TraceLine, vecStart, vecTarget, DONT_IGNORE_MONSTERS, iOtherId, iTr)
ExecuteHamB(Ham_TraceBleed, iEntId, 25.0, vecDirection, iTr, DMG_SLASH)
free_tr2(iTr)
ExecuteHamB(Ham_Killed, iEntId, iOtherId, 0)
}
}
public OnRoach_Killed(iVictim, iAttacker)
{
if(entity_get_int(iVictim, EV_INT_roachflags) & ROACH_IS)
{
new Float:vecOrigin[3], Float:vecDirection[3]
entity_get_vector(iVictim, EV_VEC_origin, vecOrigin)
xs_vec_set(vecDirection, random_float(-1.0, 1.0), random_float(-1.0, 1.0), random_float(0.0, 1.0))
UTIL_StreakSplash(vecOrigin, vecDirection, 5, 16, 50, 200);
emit_sound(iVictim, CHAN_VOICE, SOUND_ROACH_DIE, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
entity_set_string(iVictim, EV_SZ_classname, ""); // fix para find_ent_by_class
if(find_ent_by_class(-1, ROACH_CLASSNAME) <= 0)
{
g_bSomeRoachOnWorld = false;
UpdateForwards();
}
}
}
public OnRoach_BloodColor(iEntId)
{
if(entity_get_int(iEntId, EV_INT_roachflags) & ROACH_IS)
{
SetHamReturnInteger(ROACH_BLOOD)
return HAM_OVERRIDE;
}
return HAM_IGNORED;
}
public ClientCommand_Roach(iId)
{
if(!is_user_alive(iId))
{
client_print(iId, print_center, "#Cstrike_TitlesTXT_Command_Not_Available");
return PLUGIN_HANDLED;
}
new Float:vecStart[3], Float:vecAngles[3], Float:vecDiff[3]
EyePosition(iId, vecStart);
entity_get_vector(iId, EV_VEC_v_angle, vecAngles);
vecAngles[0] = 0.0;
vecAngles[2] = 0.0;
angle_vector(vecAngles, ANGLEVECTOR_FORWARD, vecDiff);
xs_vec_mul_scalar(vecDiff, SPAWN_DISTANCE, vecDiff);
xs_vec_add(vecStart, vecDiff, vecStart);
xs_vec_normalize(vecDiff, vecDiff);
if(!CreateRoach(vecStart, vecAngles, vecDiff))
{
client_print(iId, print_center, "Hazlo en algun lugar con mas espacio");
return PLUGIN_HANDLED;
}
if(!g_bSomeRoachOnWorld)
{
g_bSomeRoachOnWorld = true;
UpdateForwards();
}
client_print(iId, print_center, "Cucaracha spawneada");
return PLUGIN_CONTINUE;
}
CreateRoach(Float:vecStart[3], Float:vecAngles[3], Float:vecDirection[3])
{
new iEntId = create_entity(ROACH_REAL_CLASSNAME)
entity_set_string(iEntId, EV_SZ_classname, ROACH_CLASSNAME)
entity_set_origin(iEntId, vecStart)
entity_set_model(iEntId, MODEL_ROACH)
entity_set_size(iEntId, Float:{-1.0, -1.0, 0.0}, Float:{1.0, 1.0, 2.0}) // roach.cpp
entity_set_vector(iEntId, EV_VEC_angles, vecAngles)
entity_set_int(iEntId, EV_INT_solid, SOLID_BBOX)
entity_set_int(iEntId, EV_INT_movetype, MOVETYPE_BOUNCE)
if(IsEntityStucked(iEntId, vecStart))
{
remove_entity(iEntId);
return 0;
}
xs_vec_mul_scalar(vecDirection, ROACH_BASE_SPEED, vecDirection)
entity_set_vector(iEntId, EV_VEC_velocity, vecDirection)
entity_set_vector(iEntId, EV_VEC_roachprevpos, vecStart)
entity_set_int(iEntId, EV_INT_sequence, 0) // run
entity_set_int(iEntId, EV_INT_flags, entity_get_int(iEntId, EV_INT_flags) | FL_MONSTER)
entity_set_int(iEntId, EV_INT_roachflags, ROACH_IS)
new Float:flCurrentTime = get_gametime()
entity_set_float(iEntId, EV_FL_fov, 180.0)
entity_set_float(iEntId, EV_FL_health, 1.0)
entity_set_float(iEntId, EV_FL_gravity, 0.5)
entity_set_float(iEntId, EV_FL_friction, 0.5)
entity_set_float(iEntId, EV_FL_framerate, 1.0)
entity_set_float(iEntId, EV_FL_takedamage, DAMAGE_AIM)
entity_set_float(iEntId, EV_FL_animtime, flCurrentTime)
entity_set_float(iEntId, EV_FL_nextthink, flCurrentTime + 0.1)
entity_set_float(iEntId, EV_FL_nextroachdir, flCurrentTime)
return iEntId;
}
EyePosition(iId, Float:vecOrigin[3])
{
static Float:vecViewOffs[3]
entity_get_vector(iId, EV_VEC_view_ofs, vecViewOffs)
entity_get_vector(iId, EV_VEC_origin, vecOrigin)
xs_vec_add(vecOrigin, vecViewOffs, vecOrigin)
}
bool:IsEntityStucked(iEnt, const Float:vecPosition[3])
{
engfunc(EngFunc_TraceMonsterHull, iEnt, vecPosition, vecPosition, DONT_IGNORE_MONSTERS, iEnt, 0);
return (get_tr2(0, TR_StartSolid) || get_tr2(0, TR_AllSolid) || !get_tr2(0, TR_InOpen))
}
UpdateForwards()
{
if(g_bSomeRoachOnWorld)
{
EnableHamForward(g_pKilledFwd);
EnableHamForward(g_pBloodColorFwd);
}
else
{
DisableHamForward(g_pKilledFwd);
DisableHamForward(g_pBloodColorFwd);
}
}
UTIL_BloodDrips(const Float:vecOrigin[3], const iColor, const iSize)
{
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOrigin, 0)
write_byte(TE_BLOODSPRITE)
engfunc(EngFunc_WriteCoord, vecOrigin[0])
engfunc(EngFunc_WriteCoord, vecOrigin[1])
engfunc(EngFunc_WriteCoord, vecOrigin[2])
write_short(g_iBloodSpraySpriteId)
write_short(g_iBloodDropSpriteId)
write_byte(iColor) // color index
write_byte(iSize) // size
message_end()
}
UTIL_StreakSplash(const Float:vecOrigin[3], const Float:vecDirection[3], const iColor, const iCount, const iSpeed, const iVelocityRange)
{
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOrigin, 0);
write_byte(TE_STREAK_SPLASH);
engfunc(EngFunc_WriteCoord, vecOrigin[0]);
engfunc(EngFunc_WriteCoord, vecOrigin[1]);
engfunc(EngFunc_WriteCoord, vecOrigin[2]);
engfunc(EngFunc_WriteCoord, vecDirection[0]);
engfunc(EngFunc_WriteCoord, vecDirection[1]);
engfunc(EngFunc_WriteCoord, vecDirection[2]);
write_byte(min(iColor, 255));
write_short(iCount);
write_short(iSpeed);
write_short(iVelocityRange);// random velocity modifier
message_end();
}
- No pueden aparecer trabadas
- Al pillar una muralla buscan otra direccion
- Van girando izquierda derecha
- Las puedes pisar, matandolas y reventandoles en sangre
- Les puedes disparar y matar
- Son hermosas
Usen /roach en chat para spawnear una en frente de ustedes.
Strings en goldsrc (STRING, ALLOC_STRING, MAKE_STRING) - GoldSrc: gamedll, hlsdk, etc - Obteniendo nombres de texturas de mapas - FindEntityByString y derivados - Detectar Ataques de Knife - El Parametro fNoMonsters de los Traces - Funcion: AddToFullPack - Compresión de digitos - Native: register_event
► Si vas a pedirme ayuda con code vía Mensaje Privado, anda pensando primero como me vas a cargar la PayPal... ◄
► Si vas a pedirme ayuda con code vía Mensaje Privado, anda pensando primero como me vas a cargar la PayPal... ◄