not sure if this should be here or the suggestions/requests forum, pls move if needed. Ta.
Is there anyone who can/would be willing to iron out the bugs in this plugin. It was trashed because the owner/author was banned from the forum. It's almost perfect just these error messages in console once a mine is destroyed, and sometimes the mines aren't shootable. (no, i'm not planting admin mines!!)
They occur most of the time someone shoots after a mine is destroyed (not just near the mine, but anywhere in the server).
Code:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#define MAX_MINES 10
#define MAX_PLAYERS 32
#define TASK_MOVE 15200
new g_nMineEnts[MAX_PLAYERS][MAX_MINES]
new Float:g_fMdlSize[2][3] = { {-2.15, -4.3, -2.15}, {2.15, 4.3, 2.15} }
new bool:planting_mine[33]
new bool:waiting_time[33]=false
new g_nMineAmmo[MAX_PLAYERS][2]
new g_nCurWeapon[MAX_PLAYERS][2]
new WAITTIME[32]
new beam, boom
public new_round(id){
g_nMineAmmo[id-1][0] = (get_cvar_num("sv_tmine_ammo"))
}
public client_connect(id) {
g_nMineAmmo[id-1][0] = (get_cvar_num("sv_tmine_ammo"))
}
detonate_mine(iCurrent) {
new Float:vOrigin[3]
entity_get_vector(iCurrent, EV_VEC_origin, vOrigin)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(99) //99 = KillBeam
write_short(iCurrent)
message_end()
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(3)
write_coord(floatround(vOrigin[0]))
write_coord(floatround(vOrigin[1]))
write_coord(floatround(vOrigin[2]))
write_short(boom)
write_byte(50)
write_byte(15)
write_byte(0)
message_end()
RadiusDamage(vOrigin, 10,50)
remove_entity(iCurrent)
}
public CreateMine(id){
if (planting_mine[id]==false)
return PLUGIN_HANDLED
if( !is_user_alive( id ) )
{
client_print( id, print_chat, "You are Dead! You Have No Mines to Plant!" )
return PLUGIN_HANDLED
}
new Float:vOrigin[3]
new Float:vAngles[3]
entity_get_vector(id, EV_VEC_origin, vOrigin)
entity_get_vector(id, EV_VEC_v_angle, vAngles)
g_nMineAmmo[id-1][0] -= 1
g_nMineEnts[id-1][g_nMineAmmo[id-1][1]] = create_entity( "info_target" )
if( g_nMineEnts[id-1][g_nMineAmmo[id-1][1]] == 0 )
{
client_print( id, print_chat, "You Planted A Dud! :(" )
return PLUGIN_HANDLED
}
entity_set_string(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_SZ_classname, "tripmine")
entity_set_model(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], "models/v_tripmine.mdl")
entity_set_int(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_INT_body, 3)
entity_set_int(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_INT_sequence, 7) // 7 = TRIPMINE_WORLD
entity_set_int(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_INT_solid, 2) //*************************ADDED BY ME*************************
set_size( g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], g_fMdlSize[0], g_fMdlSize[1] )
new Float:MinBox[3]
new Float:MaxBox[3]
MinBox[0] = -8.0
MinBox[1] = -8.0
MinBox[2] = -8.0
MaxBox[0] = 8.0
MaxBox[1] = 8.0
MaxBox[2] = 8.0
entity_set_vector(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_VEC_mins, MinBox)
entity_set_vector(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_VEC_maxs, MaxBox)
new Float:vNewOrigin[3]
new Float:vNormal[3]
new Float:vTraceDirection[3]
new Float:vTraceEnd[3]
new Float:vTraceResult[3]
new Float:vEntAngles[3]
VelocityByAim(id, 64, vTraceDirection)
vTraceEnd[0] = vTraceDirection[0] + vOrigin[0]
vTraceEnd[1] = vTraceDirection[1] + vOrigin[1]
vTraceEnd[2] = vTraceDirection[2] + vOrigin[2]
trace_line(id, vOrigin, vTraceEnd, vTraceResult)
if(trace_normal(id, vOrigin, vTraceEnd, vNormal) == 0) {
remove_entity(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]])
client_print( id, print_chat, "[TRIPMINES] You must plant the tripmine on a wall!")
return PLUGIN_HANDLED_MAIN
}
vNewOrigin[0] = vTraceResult[0] + (vNormal[0] * 8.0)
vNewOrigin[1] = vTraceResult[1] + (vNormal[1] * 8.0)
vNewOrigin[2] = vTraceResult[2] + (vNormal[2] * 8.0)
entity_set_origin(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], vNewOrigin)
vector_to_angle(vNormal, vEntAngles)
entity_set_vector(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_VEC_angles, vEntAngles)
new Float:vBeamEnd[3]
new Float:vTracedBeamEnd[3]
vBeamEnd[0] = vNewOrigin[0] + (vNormal[0] * 8192)
vBeamEnd[1] = vNewOrigin[1] + (vNormal[1] * 8192)
vBeamEnd[2] = vNewOrigin[2] + (vNormal[2] * 8192)
trace_line(-1, vNewOrigin, vBeamEnd, vTracedBeamEnd)
entity_set_vector(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_VEC_vuser1, vTracedBeamEnd)
entity_set_int(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], EV_INT_movetype, 5) //5 = movetype_fly, No grav, but collides.
emit_sound(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], CHAN_WEAPON, "weapons/mine_deploy.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
emit_sound(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], CHAN_VOICE, "weapons/mine_charge.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
waiting_time[id] = true
set_task( get_cvar_float("sv_tmine_wait"), "reset_wait", 1 )
new args[4]
num_to_str(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]], args, 4)
set_task( get_cvar_float("sv_tmine_activate"), "TripMineActivate", 0, args, 4)
return PLUGIN_HANDLED_MAIN
}
public reset_wait(id){
waiting_time[id] = false
}
public TripMineActivate(MineID[]) {
new EntID = str_to_num(MineID)
new Float:vOrigin[3]
entity_get_vector(EntID, EV_VEC_origin, vOrigin)
new Float:vEnd[3]
entity_get_vector(EntID, EV_VEC_vuser1, vEnd)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(0)
write_coord(floatround(vOrigin[0]))
write_coord(floatround(vOrigin[1]))
write_coord(floatround(vOrigin[2]))
write_coord(floatround(vEnd[0]))
write_coord(floatround(vEnd[1]))
write_coord(floatround(vEnd[2]))
write_short(beam)
write_byte(0)
write_byte(0)
write_byte(10) //Life
write_byte(5) //Width
write_byte(0)
write_byte(255) // r
write_byte(0) // g
write_byte(0) // b
write_byte(get_cvar_num("sv_tmine_laseractive"))
write_byte(0)
message_end()
entity_set_int(EntID, EV_INT_iuser2, 1)
emit_sound(EntID, CHAN_VOICE, "weapons/mine_activate.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
}
public TripMineThink() {
new iCurrent
iCurrent = find_ent_by_class(-1, "tripmine")
while(iCurrent != 0) {
if(entity_get_int(iCurrent, EV_INT_iuser2) == 1) {
new Float:vOrigin[3]
entity_get_vector(iCurrent, EV_VEC_origin, vOrigin)
new Float:vEnd[3]
entity_get_vector(iCurrent, EV_VEC_vuser1, vEnd)
new Float:vTrace[3]
new iHit
iHit = trace_line(iCurrent, vOrigin, vEnd, vTrace)
if(iHit > 0) {
new szClassName[32]
entity_get_string(iHit, EV_SZ_classname, szClassName, 32);
if(equal(szClassName, "player")) {
new id
new szNetName[32]
entity_get_string(iHit, EV_SZ_netname, szNetName, 32)
client_print(id, print_chat, "[TRIPMINES] %s detonated your mine.",szNetName)
detonate_mine(iCurrent)
}
}
}
iCurrent = find_ent_by_class(iCurrent, "tripmine")
}
}
public LaserThink() {
new iCurrent
iCurrent = find_ent_by_class(-1, "tripmine")
while(iCurrent != 0) {
if(entity_get_int(iCurrent, EV_INT_iuser2) == 1) {
new Float:vOrigin[3]
entity_get_vector(iCurrent, EV_VEC_origin, vOrigin)
new Float:vEnd[3]
entity_get_vector(iCurrent, EV_VEC_vuser1, vEnd)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(0)
write_coord(floatround(vOrigin[0]))
write_coord(floatround(vOrigin[1]))
write_coord(floatround(vOrigin[2]))
write_coord(floatround(vEnd[0]))
write_coord(floatround(vEnd[1]))
write_coord(floatround(vEnd[2]))
write_short(beam)
write_byte(0)
write_byte(0)
write_byte(10) //Life
write_byte(5) //Width
write_byte(0)
write_byte(255) // r
write_byte(0) // g
write_byte(0) // b
write_byte(get_cvar_num("sv_tmine_laserstrength"))
write_byte(0)
message_end()
}
iCurrent = find_ent_by_class(iCurrent, "tripmine")
}
}
public Admin_CreateMine(id,level,cid){
if (!cmd_access(id,level,cid,1)) {
return PLUGIN_HANDLED
}
g_nMineAmmo[id-1][0] = g_nMineAmmo[id-1][0] + 1
planting_mine[id]=true
CreateMine(id)
return PLUGIN_HANDLED
}
public ClCmd_tMineHold( id ){
if( !is_user_alive( id ) )
{
client_print( id, print_chat, "You are Dead! You Have No Mines to Plant!" )
return PLUGIN_HANDLED
}
if( g_nMineAmmo[id-1][0] <= 0 )
{
client_print( id, print_chat, "You have NO Trip Mines to Plant!" )
return PLUGIN_HANDLED
}
if( CheckMovement( id ) )
{
client_print( id, print_chat, "Stand Still To Plant a Trip Mine!" )
return PLUGIN_HANDLED
}
if( waiting_time[id]==true )
{
num_to_str(get_cvar_num("sv_tmine_wait"), WAITTIME, 31)
client_print( id, print_chat, "Must wait %s seconds after planting a mine to plant another.",WAITTIME)
return PLUGIN_HANDLED
}
new Float:vOrigin[3]
new Float:vAngles[3]
new Float:vNormal[3]
new Float:vTraceDirection[3]
new Float:vTraceEnd[3]
new Float:vTraceResult[3]
entity_get_vector(id, EV_VEC_origin, vOrigin)
entity_get_vector(id, EV_VEC_v_angle, vAngles)
VelocityByAim(id, 64, vTraceDirection)
vTraceEnd[0] = vTraceDirection[0] + vOrigin[0]
vTraceEnd[1] = vTraceDirection[1] + vOrigin[1]
vTraceEnd[2] = vTraceDirection[2] + vOrigin[2]
trace_line(id, vOrigin, vTraceEnd, vTraceResult)
if(trace_normal(id, vOrigin, vTraceEnd, vNormal) == 0) {
remove_entity(g_nMineEnts[id-1][g_nMineAmmo[id-1][1]])
client_print( id, print_chat, "[TRIPMINES] You must plant the tripmine on a wall!")
return PLUGIN_HANDLED_MAIN
}
new nMinePlant_Time = get_cvar_num( "sv_tmine_plant_time" )
message_begin( MSG_ONE, 108, {0,0,0}, id )
write_byte( nMinePlant_Time )
write_byte( 0 )
message_end()
new pID[2]
pID[0] = id
set_task( 0.1, "CheckMove", (TASK_MOVE+id), pID, 1 )
set_task( float(nMinePlant_Time), "CreateMine", 1 )
planting_mine[id]=true
return PLUGIN_HANDLED
}
public ClCmd_tMineRelease( id ){
planting_mine[id]=false
if( task_exists( (TASK_MOVE+id) ) ){
remove_task( (TASK_MOVE+id) )
}
message_begin( MSG_ONE, 108, {0,0,0}, id )
write_byte( 0 )
write_byte( 0 )
message_end()
return PLUGIN_HANDLED
}
public CheckMove( p_aCmdArgs[] ){
new id = p_aCmdArgs[0]
if( CheckMovement( id ) )
ClCmd_tMineRelease( id )
else
set_task( 0.1, "CheckMove", (TASK_MOVE+id), p_aCmdArgs, 1 )
return PLUGIN_HANDLED
}
public Event_ShotFired( id ){
new wID = read_data( 2 )
new wAmmo = read_data( 3 )
if( g_nCurWeapon[id-1][0] != wID ) {
g_nCurWeapon[id-1][0] = wID
g_nCurWeapon[id-1][1] = wAmmo
return PLUGIN_CONTINUE
}
if( g_nCurWeapon[id-1][1] < wAmmo ){
g_nCurWeapon[id-1][1] = wAmmo
return PLUGIN_CONTINUE
}
if( g_nCurWeapon[id-1][1] == wAmmo )
return PLUGIN_CONTINUE
g_nCurWeapon[id-1][1] = wAmmo
g_nCurWeapon[id-1][0] = wID
new nPoint[3], nSize = get_cvar_num( "sv_tmine_size" )
get_user_origin( id, nPoint, 3 )
new nEntity = FindMine( nPoint, nSize )
if( nEntity > 0 ){
new pCmdArgs[2]
GetMine_Owner_Index( nEntity, pCmdArgs )
if( pCmdArgs[0] == id ){
client_print( id, print_chat, "You Shot One Of Your Own Mines!" )
}else{
new szMineOwner[32]
get_user_name( pCmdArgs[0], szMineOwner, 31 )
client_print( id, print_chat, "You Shot One Of %s's Proximity Mines!!", szMineOwner )
}
new iCurrent
iCurrent = find_ent_by_class(-1, "tripmine")
detonate_mine(iCurrent)
}
return PLUGIN_CONTINUE
}
GetMine_Owner_Index( nMineEntity, nOutput[] ) {
new nPlayers[MAX_PLAYERS], nNum, i, j
get_players( nPlayers, nNum, "c" )
nOutput[0] = nOutput[1] = 0
for( i = 0; i < nNum; i++ ) {
for( j = 0; j < MAX_MINES; j++ ) {
if( g_nMineEnts[nPlayers[i]-1][j] > 0 ) {
if( nMineEntity == g_nMineEnts[nPlayers[i]-1][j] ) {
nOutput[0] = nPlayers[i] // Owner ID
nOutput[1] = j // Mine Index
return
}
}
}
}
return
}
FindMine( p_nUserOrigin[3], p_nRadius ) {
new nPlayers[MAX_PLAYERS], nNum, i, j
new nEOrigin[3], Float:fEOrigin[3]
new nProximity = 0
get_players( nPlayers, nNum, "c" )
for( i = 0; i < nNum; i++ ){
for( j = 0; j < MAX_MINES; j++ ){
if( g_nMineEnts[nPlayers[i]-1][j] != 0 ){
entity_get_vector( g_nMineEnts[nPlayers[i]-1][j], EV_VEC_origin, fEOrigin )
FVecIVec( fEOrigin, nEOrigin )
nProximity = get_distance( p_nUserOrigin, nEOrigin )
if( nProximity <= p_nRadius ){
return g_nMineEnts[nPlayers[i]-1][j]
}
}
}
}
return 0
}
RemovePlantedMines( id ) {
for( new i = 0; i < MAX_MINES; i++ ) {
if( g_nMineEnts[id-1][i] > 0 ) {
remove_entity( g_nMineEnts[id-1][i] )
g_nMineEnts[id-1][i] = 0
}
}
g_nMineAmmo[id-1][1] = 0
return
}
public client_authorized( id ) {
g_nMineAmmo[id-1][0] = 0
RemovePlantedMines( id )
return PLUGIN_CONTINUE
}
public client_disconnect( id ) {
g_nMineAmmo[id-1][0] = 0
RemovePlantedMines( id )
return PLUGIN_CONTINUE
}
bool:CheckMovement( id ){
if( get_user_button( id ) & (IN_JUMP|IN_FORWARD|IN_BACK|IN_MOVELEFT|IN_MOVERIGHT) )
return true
return false
}
public plugin_precache() {
precache_sound("weapons/mine_deploy.wav")
precache_sound("weapons/mine_charge.wav")
precache_sound("weapons/mine_activate.wav")
precache_model("models/v_tripmine.mdl")
beam = precache_model("sprites/laserbeam.spr")
boom = precache_model("sprites/zerogxplode.spr")
return PLUGIN_CONTINUE
}
public plugin_init(){
register_plugin("Trip Mines","2.6","Blunted1 & Burnzy")
register_cvar("amx_tripmines","1",FCVAR_SERVER)
register_clcmd("+tmine","ClCmd_tMineHold",-1,"- Bind z +tmine Then hold Z!")
register_clcmd("-tmine","ClCmd_tMineRelease",-1,"")
register_concmd("admin_tripmine","Admin_CreateMine", ADMIN_LEVEL_H)
register_event("ResetHUD","new_round","b")
register_event("CurWeapon","Event_ShotFired","b")
register_cvar("sv_tmine_plant_time","3")
register_cvar("sv_tmine_ammo","5")
register_cvar("sv_tmine_laserstrength","25")
register_cvar("sv_tmine_laseractive","100")
register_cvar("sv_tmine_activate","3")
register_cvar("sv_tmine_size","9")
register_cvar("sv_tmine_wait","10")
set_task(0.01,"TripMineThink",0,"",0,"b")
set_task(1.0,"LaserThink",0,"",0,"b")
set_task(2.0,"check_cvars",0,"",0,"b")
return PLUGIN_CONTINUE
}
public check_cvars() {
if (get_cvar_num("sv_tmine_ammo") > 10) {
server_print("[TRIPMINES] sv_tmine_ammo can not be greater than 10, setting cvar to 10 now.")
set_cvar_num("sv_tmine_ammo", 10)
}
if (get_cvar_num("sv_tmine_ammo") < 1) {
server_print("[TRIPMINES] sv_tmine_ammo can not be less than 1, setting cvar to 1 now.")
set_cvar_num("sv_tmine_ammo", 1)
}
if (get_cvar_num("sv_tmine_plant_time") > 15) {
server_print("[TRIPMINES] sv_tmine_plant_time can not be greater than 15, setting cvar to 15 now.")
set_cvar_num("sv_tmine_plant_time", 15)
}
if (get_cvar_num("sv_tmine_plant_time") < 2) {
server_print("[TRIPMINES] sv_tmine_plant_time can not be less than 2, setting cvar to 2 now.")
set_cvar_num("sv_tmine_plant_time", 2)
}
if (get_cvar_num("sv_tmine_wait") < 5 ) {
server_print("[TRIPMINES] sv_tmine_wait can not be less than 5, setting cvar to 5 now.")
set_cvar_num("sv_tmine_wait",5)
}
if (get_cvar_num("sv_tmine_wait") > 50 ) {
server_print("[TRIPMINES] sv_tmine_wait can not be greater than 50, setting cvar to 50 now.")
set_cvar_num("sv_tmine_wait",50)
}
if (get_cvar_num("sv_tmine_activate") < 1 ) {
server_print("[TRIPMINES] sv_tmine_activate can not be less than 1, setting cvar to 1 now.")
set_cvar_num("sv_tmine_activate",1)
}
if (get_cvar_num("sv_tmine_activate") > 10 ) {
server_print("[TRIPMINES] sv_tmine_activate can not be greater than 10, setting cvar to 10 now.")
set_cvar_num("sv_tmine_activate",10)
}
if (get_cvar_num("sv_tmine_size") < 8 ) {
server_print("[TRIPMINES] sv_tmine_size can not be less than 8, setting cvar to 8 now.")
set_cvar_num("sv_tmine_size",8)
}
if (get_cvar_num("sv_tmine_size") > 10 ) {
server_print("[TRIPMINES] sv_tmine_size can not be greater than 10, setting cvar to 10 now.")
set_cvar_num("sv_tmine_size",10)
}
if (get_cvar_num("sv_tmine_laseractive") < 100 ) {
server_print("[TRIPMINES] sv_tmine_laseractive can not be greater than 100, setting cvar to 100 now.")
set_cvar_num("sv_tmine_size",100)
}
if (get_cvar_num("sv_tmine_laseractive") > 200 ) {
server_print("[TRIPMINES] sv_tmine_laseractive can not be greater than 200, setting cvar to 200 now.")
set_cvar_num("sv_tmine_size",200)
}
if (get_cvar_num("sv_tmine_laserstrength") < 15 ) {
server_print("[TRIPMINES] sv_tmine_laserstrength can not be greater than 15, setting cvar to 15 now.")
set_cvar_num("sv_tmine_size",15)
}
if (get_cvar_num("sv_tmine_laserstrength") > 80 ) {
server_print("[TRIPMINES] sv_tmine_laserstrength can not be greater than 80, setting cvar to 80 now.")
set_cvar_num("sv_tmine_size",80)
}
}