Primero que nada:
Modulo:Orpheu 2.3a
Para que se den una idea, cuando hookean una función con HamSandwich, estan hookeando una función virtual. Nada mas que Orpheu permite hookear la función que uno quiera, pero con el ejemplo que voy a dar mas adelante vamos a hookear las básicas.
Para esto, necesitamos saber el nombre, la clase, el index y los argumentos de la función.
¿Como se obtiene? Muy Facil. (Para algunos)
1) Necesitamos
este software
2) Necesitamos la libreria del mod en la version de linux (en este caso, cs, seria cs_i386.so)
3) Pasamos a desensamblarla
4) Seleccionamos nuevo
[IMG]http://img208.**************/img208/8749/12820721.png[/IMG]
5) Seleccionamos la pestaña "Unix" despues "ELF/COFF Dynamic Library"
[IMG]http://img694.**************/img694/1284/37280226.png[/IMG]
6) Seleccionamos el archivo y esperamos a que la computadora procese, y cuando termina en la pestaña "Names" buscamos " CBasePlayer`vtbl' "
[IMG]http://img199.**************/img199/1285/12974837.png[/IMG]
7) Hacemos doble click y ahí va a aparecer una lista con las funciones basicas que se pueden Hookear
Ahora nos vamos a centrar en la funcion "Spawn"
[IMG]http://img200.**************/img200/9868/38486216.png[/IMG]
¿Cómo obtenemos el id?
Hay 2 opciones
1) Se puede contar la posicion que tiene en la lista empezando de 0 (obviando los 2 primeros que no tienen nombre), entonces como tiene la primera posición:
Spawn es 0 para windows
Spawn es 2 para linux (A todos los index de windows, se le suman 2 para linux)
Si seguimos contando, TakeDamage seria el id 12, TraceAttack id 11, etc. Siempre hablando de id de windows.
2) Abren hamdata.ini y buscan los id para counter strike.
Code:
@section cstrike windows
pev 4
base 0x0
spawn 0
precache 1
keyvalue 3
objectcaps 6
activate 7
setobjectcollisionbox 8
classify 9
deathnotice 10
traceattack 11
takedamage 12
takehealth 13
killed 14
bloodcolor 15
tracebleed 16
istriggered 17
mymonsterpointer 18
mysquadmonsterpointer 19
gettogglestate 20
addpoints 21
addpointstoteam 22
addplayeritem 23
removeplayeritem 24
giveammo 25
getdelay 26
ismoving 27
overridereset 28
damagedecal 29
settogglestate 30
startsneaking 31
stopsneaking 32
oncontrols 33
issneaking 34
isalive 35
isbspmodel 36
reflectgauss 37
hastarget 38
isinworld 39
isplayer 40
isnetclient 41
teamid 42
getnexttarget 43
think 44
touch 45
use 46
blocked 47
respawn 48
updateowner 49
fbecomeprone 50
center 51
eyeposition 52
earposition 53
bodytarget 54
illumination 55
fvisible 56
fvecvisible 57
player_jump 76
player_duck 77
player_prethink 78
player_postthink 79
player_getgunposition 80
player_shouldfadeondeath 66
player_impulsecommands 82
player_updateclientdata 81
item_addtoplayer 59
item_addduplicate 60
item_getiteminfo 61
item_candeploy 62
item_deploy 64
item_canholster 66
item_holster 67
item_updateiteminfo 68
item_preframe 69
item_postframe 70
item_drop 71
item_kill 72
item_attachtoplayer 73
item_primaryammoindex 74
item_secondaryammoindex 75
item_updateclientdata 76
item_getweaponptr 77
item_itemslot 79
weapon_extractammo 80
weapon_extractclipammo 81
weapon_addweapon 82
weapon_playemptysound 83
weapon_resetemptysound 84
weapon_sendweaponanim 85
weapon_isusable 86
weapon_primaryattack 87
weapon_secondaryattack 88
weapon_reload 89
weapon_weaponidle 90
weapon_retireweapon 91
weapon_shouldweaponidle 92
weapon_usedecrement 93
cstrike_restart 2
cstrike_roundrespawn 84
cstrike_item_candrop 63
cstrike_item_getmaxspeed 78
@end
Para linux, le suman 2
Ya tenemos el id (0), el nombre de la función (Spawn), y la clase de la función (CBasePlayer), ¿Cómo obtenemos los parámetros de la función?
Se hace doble click sobre el nombre de la función y si se fijan, el parámetro de la funcion es "Void" lo que significa Nada, o sea, no tiene parámetros. Pero cuando llamamos al public de la función, el primer parámetro siempre, pero siempre, va a ser el id de la entidad que registramos, en este caso el id del player. Si la funcion llegara a tener algun parámetro se pone en el public despues del id (ejemplo: public orpheu_takedamage(ID,otro_parametro, otro_parametro2, etc) )
Para armar el archivo "signature":
1) Crean un archivo en Bloc de notas cuyo nombre sería el nombre de la función
2) Copian esto
Code:
{
"name" : "Spawn",
"class" : "CBasePlayer",
"library" : "mod",
"indexes" :
[
{
"os" : "windows",
"mod" : "cstrike",
"value" : 0
}
]
}
3) Guardan el archivo sin extensión, o sea, quedaría Spawn no Spawn.txt o Spawn.ini
4)Ese archivo lo colocan en
Code:
addons\amxmodx\configs\orpheu\virtualFunctions\CBasePlayer
y listo, ya tienen el "signature" armado.
Nota: Para cada función que hookeen tienen que armar 1 archivo.
Ahora, ¿Cómo usamos esto en un plugin?
PHP Code:
#include <amxmodx>
#include <orpheu>
public plugin_init()
{
OrpheuRegisterHook(OrpheuGetFunctionFromClass("player","Spawn","CBasePlayer"),"orpheu_player_spawn")
OrpheuRegisterHook(OrpheuGetFunctionFromClass("player","PreThink","CBasePlayer"),"orpheu_player_prethink")
OrpheuRegisterHook(OrpheuGetFunctionFromClass("player","PostThink","CBasePlayer"),"orpheu_player_postthink")
OrpheuRegisterHook(OrpheuGetFunctionFromClass("player","Jump","CBasePlayer"),"orpheu_player_jump")
OrpheuRegisterHook(OrpheuGetFunctionFromClass("player","Duck","CBasePlayer"),"orpheu_player_duck")
OrpheuRegisterHook(OrpheuGetFunctionFromClass("player","TakeDamage","CBasePlayer"),"orpheu_takedamage")
OrpheuRegisterHook(OrpheuGetFunctionFromClass("player","TraceAttack","CBasePlayer"),"orpheu_trace_attack")
OrpheuRegisterHook(OrpheuGetFunctionFromClass("player","Killed","CBasePlayer"),"orpheu_player_killed")
}
public orpheu_player_spawn(id)
{
//Player Spawn
}
public orpheu_player_prethink(id)
{
//Player Prethink
}
public orpheu_player_postthink(id)
{
//Player PostThink
}
public orpheu_player_jump(id)
{
//Player Jump
}
public orpheu_player_duck(id)
{
//Player Duck
}
public orpheu_takedamage(id,inflictor,attacker,Float:damage,damage_bits)
{
//Takedamage (igual que el de hamsandwich)
}
public orpheu_trace_attack(id,attacker,Float:damage,Float:direction[3],tracehandle,damage_bits)
{
//Trace Attack (igual que el de hamsandwich)
}
public orpheu_player_killed(id,attacker,shouldgib)
{
//Player Killed (igual que el de hamsandwich)
}
Las signatures las adjunto.