| ConnorMcLeod |
10-24-2009 05:12 |
Re: checkpoint and gocheck
Light version of the one i use on my server (no gravity bug and no stuck bug) :
PHP Code:
/* Formatright © 2009, ConnorMcLeod
Kz CheckPoints is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Kz CheckPoints; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <amxmodx> #include <engine> #include <fakemeta> #include <fun>
#define VERSION "0.0.5"
new const Float:VEC_DUCK_HULL_MIN[3] = {-16.0, -16.0, -18.0 } new const Float:VEC_DUCK_HULL_MAX[3] = { 16.0, 16.0, 18.0 } new const Float:VEC_NULL[3] = { 0.0, 0.0, 0.0 }
#define MAX_PLAYERS 32
const FL_ONGROUND2 = (FL_ONGROUND | FL_PARTIALGROUND | FL_INWATER | FL_CONVEYOR | FL_FLOAT)
new Float:g_flCurPosition_Origin[MAX_PLAYERS+1][3] new Float:g_flCurPosition_Angles[MAX_PLAYERS+1][3]
new Float:g_flPrevPosition_Origin[MAX_PLAYERS+1][3] new Float:g_flPrevPosition_Angles[MAX_PLAYERS+1][3]
new Float:g_flNextCmd[MAX_PLAYERS+1]
public plugin_init() { register_plugin("Kz CheckPoints", VERSION, "ConnorMcLeod" )
register_saycmd("checkpoint", "ClientCommand_CheckPoint") register_saycmd("cp", "ClientCommand_CheckPoint")
register_saycmd("gocheck", "ClientCommand_GoCheck") register_saycmd("gc", "ClientCommand_GoCheck") register_saycmd("tp", "ClientCommand_GoCheck")
register_saycmd("stuck", "ClientCommand_Stuck") }
public client_putinserver(id) { for(new i; i<3; i++) { g_flCurPosition_Origin[id][i] = 0.0 g_flCurPosition_Angles[id][i] = 0.0 + _:(i==2) g_flPrevPosition_Origin[id][i] = 0.0 g_flPrevPosition_Angles[id][i] = 0.0 + _:(i==2) // i use Angles[2] to store gravity } g_flNextCmd[id] = 0.0 }
bool:bCheckFlood(id, Float:flDelay = 1.0) { static Float:flTime flTime = get_gametime()
if(g_flNextCmd[id] > flTime) { return true }
g_flNextCmd[id] = flTime + flDelay return false }
public ClientCommand_Stuck(id) { if( !is_user_alive(id) || bCheckFlood(id) ) { return PLUGIN_HANDLED }
if( !g_flPrevPosition_Origin[id][0] && !g_flPrevPosition_Origin[id][1] && !g_flPrevPosition_Origin[id][2] ) { client_print(id, print_center, "No Previous CheckPoint !!") return PLUGIN_HANDLED }
for(new i; i<3; i++) { g_flCurPosition_Origin[id][i] = g_flPrevPosition_Origin[id][i] g_flCurPosition_Angles[id][i] = g_flPrevPosition_Angles[id][i] g_flPrevPosition_Origin[id][i] = 0.0 }
g_flNextCmd[id] = get_gametime() ClientCommand_GoCheck(id)
return PLUGIN_HANDLED }
public ClientCommand_CheckPoint(id) { if( !is_user_alive(id) || !(entity_get_int(id, EV_INT_flags) & FL_ONGROUND2) || bCheckFlood(id) ) { return PLUGIN_HANDLED }
for(new i; i<3; i++) { g_flPrevPosition_Origin[id][i] = g_flCurPosition_Origin[id][i] g_flPrevPosition_Angles[id][i] = g_flCurPosition_Angles[id][i] }
entity_get_vector(id, EV_VEC_origin, g_flCurPosition_Origin[id]) entity_get_vector(id, EV_VEC_v_angle, g_flCurPosition_Angles[id]) g_flCurPosition_Angles[id][2] = get_user_gravity(id)
return PLUGIN_HANDLED }
public ClientCommand_GoCheck(id) { if( !is_user_alive(id) || bCheckFlood(id) ) { return PLUGIN_HANDLED }
if( !g_flCurPosition_Origin[id][0] && !g_flCurPosition_Origin[id][1] && !g_flCurPosition_Origin[id][2] ) { client_print(id, print_center, "No CheckPoint Set !!") return PLUGIN_HANDLED }
Util_SetOrigin(id, g_flCurPosition_Origin[id], g_flCurPosition_Angles[id])
return PLUGIN_HANDLED }
register_saycmd(saycommand[], function[], flags = -1, info[] = "", FlagManager = -1) { new temp[64]; formatex(temp, 63, "say /%s", saycommand); register_clcmd(temp, function, flags, info, FlagManager); formatex(temp, 63, "say .%s", saycommand); register_clcmd(temp, function, flags, info, FlagManager); formatex(temp, 63, "say_team /%s", saycommand, FlagManager); register_clcmd(temp, function, flags, info); formatex(temp, 63, "say_team .%s", saycommand, FlagManager); register_clcmd(temp, function, flags, info, FlagManager); formatex(temp, 63, ".%s", saycommand); register_clcmd(temp, function, flags, info, FlagManager); formatex(temp, 63, "/%s", saycommand); register_clcmd(temp, function, flags, info, FlagManager); }
Util_SetOrigin(id, Float:flOrigin[3], Float:flAngles[3]) { entity_set_int(id, EV_INT_flags, entity_get_int(id, EV_INT_flags) | FL_DUCKING) engfunc(EngFunc_SetSize, id, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX) engfunc(EngFunc_SetOrigin, id, flOrigin)
entity_set_vector(id, EV_VEC_v_angle, VEC_NULL) entity_set_vector(id, EV_VEC_velocity, VEC_NULL) entity_set_vector(id, EV_VEC_angles, flAngles) entity_set_vector(id, EV_VEC_punchangle, VEC_NULL) entity_set_int(id, EV_INT_fixangle, 1)
set_user_gravity(id, flAngles[2])
entity_set_float(id, EV_FL_fuser2, 0.0) }
|