mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-25 06:15:37 +03:00
Fixed Strip() bugs
This commit is contained in:
parent
85afb2a823
commit
edfb24bcd1
240
compiler/scasm/adminslots.asm
Executable file
240
compiler/scasm/adminslots.asm
Executable file
@ -0,0 +1,240 @@
|
||||
;(C)2004 David "BAILOPAN" Anderson
|
||||
; Assembler version of Anti-Flood
|
||||
#define VERSION "0.20-A"
|
||||
#define PLUGIN_HANDLED
|
||||
#macro ARGN(argc) (12+(argc*CELL))
|
||||
|
||||
.CODE
|
||||
halt 0 ;Return point for end
|
||||
|
||||
.NATIVE
|
||||
register_plugin
|
||||
register_cvar
|
||||
random_num
|
||||
register_clcmd
|
||||
server_cmd
|
||||
get_maxplayers
|
||||
get_playersnum
|
||||
get_cvar_num
|
||||
set_cvar_num
|
||||
get_user_flags
|
||||
client_cmd
|
||||
get_user_userid
|
||||
|
||||
.DATA
|
||||
Plugin db "Slots Reservation"
|
||||
Version db VERSION
|
||||
Author db "AMXX Dev Team"
|
||||
Cvar db "amx_reservation"
|
||||
CvarVal db "1"
|
||||
Callback db "ackSignal"
|
||||
loopBack db "amxres0000"
|
||||
|
||||
.CODE
|
||||
PROC plugin_init
|
||||
push.c Author ;push author
|
||||
push.c Version ;push version
|
||||
push.c Plugin ;push name
|
||||
push.c CELL*3 ;push 3 args
|
||||
sysreq.c register_plugin ;call register_plugin
|
||||
stack CELL*4 ;clean-up
|
||||
|
||||
push.c CvarVal ;push Cvar initial value
|
||||
push.c Cvar ;push Cvar
|
||||
push.c CELL*2 ;push 2 args
|
||||
sysreq.c register_cvar ;call register_cvar
|
||||
stack CELL*3 ;clean-up
|
||||
|
||||
push.c 90 ;push max range
|
||||
push.c 65 ;push min range
|
||||
push.c CELL*2 ;push 2 args
|
||||
sysreq.c random_num ;call random_num
|
||||
stack CELL*3 ;clean-up
|
||||
stor.pri loopBack+CELL*6 ;store pri in loopBack[6]
|
||||
|
||||
push.c 90 ;push max range
|
||||
push.c 65 ;push min range
|
||||
push.c CELL*2 ;push 2 args
|
||||
sysreq.c random_num ;call random_num
|
||||
stack CELL*3 ;clean-up
|
||||
stor.pri loopBack+CELL*7 ;store pri in loopBack[7]
|
||||
|
||||
push.c 90 ;push max range
|
||||
push.c 65 ;push min range
|
||||
push.c CELL*2 ;push 2 args
|
||||
sysreq.c random_num ;call random_num
|
||||
stack CELL*3 ;clean-up
|
||||
stor.pri loopBack+CELL*8 ;store pri in loopBack[8]
|
||||
|
||||
push.c 90 ;push max range
|
||||
push.c 65 ;push min range
|
||||
push.c CELL*2 ;push 2 args
|
||||
sysreq.c random_num ;call random_num
|
||||
stack CELL*3 ;clean-up
|
||||
stor.pri loopBack+CELL*9 ;store pri in loopBack[9]
|
||||
|
||||
push.c Callback ;push callback
|
||||
push.c loopBack ;push loopback
|
||||
push.c CELL*2
|
||||
sysreq.c register_clcmd ;call register_clcmd
|
||||
stack CELL*3 ;clean-up
|
||||
|
||||
zero.pri ;return 0
|
||||
retn ;final cleanup
|
||||
ENDP
|
||||
|
||||
.DATA
|
||||
KickMsg db "kick #%d \"Dropped due to slot reservation\""
|
||||
|
||||
.CODE
|
||||
PROC ackSignal
|
||||
push.s ARGN(0) ;push the first argument
|
||||
push.c CELL*1 ;push one argument
|
||||
sysreq.c get_user_userid ;call get_user_userid
|
||||
stack CELL*2 ;clean-up
|
||||
|
||||
push.pri ;push the result of the last call
|
||||
push.c KickMsg ;push the kick message
|
||||
push.c CELL*2 ;push 2 args
|
||||
sysreq.c server_cmd ;call server_cmd
|
||||
stack CELL*3 ;clean-up
|
||||
|
||||
zero.pri ;return 0
|
||||
retn ;final cleanup
|
||||
ENDP
|
||||
|
||||
.DATA
|
||||
VisCvar db "sv_visiblemaxplayers"
|
||||
|
||||
.CODE
|
||||
;players, maxplayrs, limit
|
||||
PROC setVisibleSlots
|
||||
stack -CELL ;new variable
|
||||
|
||||
load.s.pri ARGN(0) ;get first parameter into [PRI]
|
||||
add.c 1 ;[PRI] += 1
|
||||
stor.s.pri -CELL ;[var] = [PRI]
|
||||
|
||||
load.s.pri ARGN(0) ;Reset [PRI] to first param
|
||||
load.s.alt ARGN(1) ;get second parameter into [ALT]
|
||||
jeq setMax ;does players == maxplayers?
|
||||
jump setLimitCheck ; -- no, jump to next check
|
||||
setMax: ; -- yes
|
||||
stor.s.alt -CELL ; store the maxplayers into [var]
|
||||
jump endSetIf ; we're done, jump to the end
|
||||
setLimitCheck:
|
||||
load.s.alt ARGN(2) ;load the third param into [ALT]
|
||||
jless setLimit ;is playres < limit?
|
||||
jump endSetIf ; -- no, jump to end
|
||||
setLimit: ; -- yes
|
||||
stor.s.alt -CELL ;store limit into [var]
|
||||
endSetIf:
|
||||
|
||||
push.s -CELL ;push [var] onto stack
|
||||
push.c VisCvar ;push cvar onto stack
|
||||
push.c CELL*2 ;push 2 args
|
||||
sysreq.c set_cvar_num ;call set_cvar_num
|
||||
stack CELL*3 ;clean-up
|
||||
|
||||
stack CELL ;restore stack
|
||||
zero.pri ;return 0
|
||||
retn ;final cleanup
|
||||
ENDP
|
||||
|
||||
PROC client_authorized
|
||||
push.c 0 ;push 0 args
|
||||
sysreq.c get_maxplayers ;call get_maxplayers
|
||||
stack CELL ;clean-up
|
||||
push.pri ;store the result - maxplayers
|
||||
|
||||
push.c 1 ;push 1
|
||||
push.c CELL ;push 1 args
|
||||
sysreq.c get_playersnum ;call get_playersnum
|
||||
stack CELL*2 ;clean-up
|
||||
push.pri ;store the result - players
|
||||
|
||||
push.c Cvar ;push cvar
|
||||
push.c CELL ;push 1 arg
|
||||
sysreq.c get_cvar_num ;call get_cvar_num
|
||||
stack CELL*2 ;clean-up
|
||||
xchg ;last result is now in alt
|
||||
|
||||
load.s.pri -CELL ;load the first result into pri
|
||||
sub ;pri = maxplayers - cvar
|
||||
push.pri ;store the result - limit
|
||||
|
||||
push.s ARGN(0) ;push the id
|
||||
push.c CELL ;push 1 arg
|
||||
sysreq.c get_user_flags ;call get_user_flags
|
||||
stack CELL*2 ;clean-up
|
||||
const.alt 2 ;2 = ADMIN_RESERVATION
|
||||
and ;flags & 2
|
||||
|
||||
jeq setVis ;if (flags & 2) == 2, short circuit
|
||||
;otherwise check this condition
|
||||
load.s.pri -CELL*2 ;load players into pri
|
||||
load.s.alt -CELL*3 ;load limit into alt
|
||||
jleq setVis ;if players <= limit, jump
|
||||
jump setVisSkip ;otherwise skip
|
||||
setVis:
|
||||
push.s -CELL*3 ;push limit
|
||||
push.s -CELL ;push maxplayers
|
||||
push.s -CELL*2 ;push players
|
||||
push.c CELL*3 ;push 3 args
|
||||
call setVisibleSlots ;call setVisibleSlots
|
||||
stack CELL*3 ;restore stack
|
||||
zero.pri ;return 0
|
||||
retn ;finalize
|
||||
setVisSkip:
|
||||
|
||||
push.c loopBack ;push loopback cmd
|
||||
push.s ARGN(0) ;push the id passed
|
||||
push.c CELL*2 ;push 2 args
|
||||
sysreq.c client_cmd ;call client_cmd
|
||||
stack CELL*3 ;clean-up
|
||||
|
||||
stack CELL*3 ;restore stack
|
||||
const.pri PLUGIN_HANDLED ;return
|
||||
retn ;finalize
|
||||
ENDP
|
||||
|
||||
PROC client_disconnect
|
||||
push.c 0 ;push 0 args
|
||||
sysreq.c get_maxplayers ;call get_maxplayers
|
||||
stack CELL ;clean-up
|
||||
push.pri ;store the result - maxplayers
|
||||
|
||||
push.c 1 ;push 1
|
||||
push.c CELL ;push 1 args
|
||||
sysreq.c get_playersnum ;call get_playersnum
|
||||
stack CELL*2 ;clean-up
|
||||
push.pri ;store the result - players
|
||||
dec.s -CELL*2 ;players--
|
||||
|
||||
push.c Cvar ;push cvar
|
||||
push.c CELL ;push 1 arg
|
||||
sysreq.c get_cvar_num ;call get_cvar_num
|
||||
stack CELL*2 ;clean-up
|
||||
xchg ;last result is now in alt
|
||||
load.s.pri -CELL ;[pri] = maxplayers
|
||||
sub ;[pri] = maxplayers - cvar
|
||||
push.pri ;store the result - limit
|
||||
|
||||
push.s -CELL*3 ;push limit
|
||||
push.s -CELL ;push maxplayers
|
||||
push.s -CELL*2 ;push playersnum-1
|
||||
push.c CELL*3 ;push 3 args
|
||||
call setVisibleSlots ;call
|
||||
|
||||
stack 3*CELL ;clean up 3 vars
|
||||
|
||||
zero.pri ;return 0
|
||||
retn ;finalize
|
||||
ENDP
|
||||
|
||||
|
||||
.PUBLIC
|
||||
ackSignal
|
||||
plugin_init
|
||||
client_authorized
|
||||
client_disconnect
|
@ -417,9 +417,10 @@ bool Compiler::Parse()
|
||||
|
||||
/* Strip the line */
|
||||
std::string line(buffer);
|
||||
|
||||
StripComments(line);
|
||||
Strip(line);
|
||||
|
||||
|
||||
if (line.size() < 1)
|
||||
continue;
|
||||
|
||||
|
@ -120,30 +120,41 @@ void Strip(std::string &text)
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<(int)text.size(); i++)
|
||||
if (isspace(text[0]))
|
||||
{
|
||||
if (!isspace(text[i]))
|
||||
for (i=0; i<(int)text.size(); i++)
|
||||
{
|
||||
if (i!=0)
|
||||
if (!isspace(text[i])
|
||||
|| (isspace(text[i]) && (i==(int)(text.size()-1))))
|
||||
{
|
||||
text.erase(0, i);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (text.size() < 1)
|
||||
return;
|
||||
|
||||
for (i=(int)(text.size()-1); i>=0; i--)
|
||||
if (isspace(text[text.size()-1]))
|
||||
{
|
||||
if (!isspace(text[i]))
|
||||
for (i=(int)(text.size()-1); i>=0; i--)
|
||||
{
|
||||
if (i != (int)(text.size() - 1))
|
||||
if (!isspace(text[i])
|
||||
|| (isspace(text[i]) && (i==0)))
|
||||
{
|
||||
text.erase(i+1, text.size()-1-i);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (text.size() == 1)
|
||||
{
|
||||
if (isspace(text[0]))
|
||||
{
|
||||
text.clear();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -28,8 +28,6 @@ int main(int argc, char **argv)
|
||||
{
|
||||
Compiler Program;
|
||||
|
||||
getchar();
|
||||
|
||||
get_options(argc, argv, Program);
|
||||
|
||||
if (filename.size() < 1)
|
||||
|
Loading…
Reference in New Issue
Block a user