Raised This Month: $51 Target: $400
 12% 

[ES][TUT] Hookear funciones virtuales con Orpheu


  
 
 
Thread Tools Display Modes
Author Message
Starsailor
horrible hahah
Join Date: Aug 2008
Location: Buenos Aires
Old 07-05-2010 , 16:00   [ES][TUT] Hookear funciones virtuales con Orpheu
#1

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.
Attached Files
File Type: zip Signatures.zip (1.7 KB, 170 views)
__________________
Find my plugins here..

Ex - Spanish Moderator.

Last edited by Starsailor; 07-05-2010 at 17:17.
Starsailor is offline
Starsailor
horrible hahah
Join Date: Aug 2008
Location: Buenos Aires
Old 07-05-2010 , 16:01   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#2

Esas son las funciones basicas, seria complicado usar este metodo para hookearlas, pero lo hice para que sepan hacerlo.
Por ejemplo, se pueden hookear otras funciones y hacer otros plugins.

PHP Code:
//Para que la ak-47 no se recargue sola, sino que la tenga que recargar el player.

#include <amxmodx>
#include <orpheu>

#define ITEM_FLAG_NOAUTORELOAD      2

public plugin_precache()
{
    
OrpheuRegisterHook(OrpheuGetFunctionFromClass("weapon_ak47","GetItemInfo","CBasePlayerItem"),"orpheu_iteminfo",OrpheuHookPost);
}

public 
orpheu_iteminfo(item,ItemInfo)
{
    
OrpheuSetParamStructMember(2,"iFlags",ITEM_FLAG_NOAUTORELOAD)

PHP Code:
//Para que la ak-47 este en el slot que yo quiera

#include <amxmodx>
#include <orpheu>

#define SLOT     3

public plugin_precache()
{
    
OrpheuRegisterHook(OrpheuGetFunctionFromClass("weapon_ak47","GetItemInfo","CBasePlayerItem"),"orpheu_iteminfo",OrpheuHookPost);
}

public 
orpheu_iteminfo(item,ItemInfo)
{
    
OrpheuSetParamStructMember(2,"iSlot",SLOT 1)

En este caso la signature va en

Code:
addons\amxmodx\configs\orpheu\virtualFunctions\CBasePlayerItem
Hay muchísimas mas funciones que se pueden hookear, pero estas son con las que probe.

Si tienen alguna duda o no entienden algo, pregunten.
Attached Files
File Type: zip GetItemInfo.zip (250 Bytes, 147 views)
__________________
Find my plugins here..

Ex - Spanish Moderator.

Last edited by Starsailor; 07-06-2010 at 13:25.
Starsailor is offline
AfteR.
Veteran Member
Join Date: Dec 2008
Location: λ
Old 07-05-2010 , 16:02   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#3

Se supone que orpheu es mucho mejor que hamsandwich / fakemeta?
AfteR. is offline
Starsailor
horrible hahah
Join Date: Aug 2008
Location: Buenos Aires
Old 07-05-2010 , 16:14   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#4

Quote:
Originally Posted by AfteR. View Post
Se supone que orpheu es mucho mejor que hamsandwich / fakemeta?
No se si mucho mejor, pero para estos casos (Hookear Spawn, TakeDamage) conviene usar HamSandwich, que es mas simple y usa el mismo metodo.
Orpheu te permite hookear otras funciones virtuales que hamsandwich no.
__________________
Find my plugins here..

Ex - Spanish Moderator.
Starsailor is offline
Alucard^
AMXX Moderator: Others
Join Date: Sep 2007
Location: Street
Old 07-05-2010 , 17:09   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#5

After, en resumen, se podria decir que Orpheu sirve mas que nada para hacer cosas que no podes mediante otros modulos...

Starsailor, tengo una duda.. con respecto a esto.

PHP Code:
OrpheuSetParamStructMember(2,"iFlags",ITEM_FLAG_NOAUTORELOAD
Que son esos parametros? o mejor dicho, que es el parametro "iFlags"? de donde lo sacas? o que hace?
__________________
Approved Plugins - Steam Profile

Public non-terminated projects:
All Admins Menu, HLTV parameters, Subnick,
Second Password (cool style), InfoZone,
Binary C4 plant/defuse, and more...

Private projects:
NoSpec (+menu), NV Surf Management,
PM Adanved System, KZ longjump2, and more...
Alucard^ is offline
Send a message via Skype™ to Alucard^
Starsailor
horrible hahah
Join Date: Aug 2008
Location: Buenos Aires
Old 07-05-2010 , 17:15   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#6

weapons.h


iFlags son los flags del arma.

PHP Code:
#define ITEM_FLAG_SELECTONEMPTY        1
#define ITEM_FLAG_NOAUTORELOAD        2
#define ITEM_FLAG_NOAUTOSWITCHEMPTY    4
#define ITEM_FLAG_LIMITINWORLD        8
#define ITEM_FLAG_EXHAUSTIBLE        16 // A player can totally exhaust their ammo supply and lose this weapon

#define WEAPON_IS_ONTARGET 0x40

typedef struct
{
    
int        iSlot;
    
int        iPosition;
    const 
char    *pszAmmo1;    // ammo 1 type
    
int        iMaxAmmo1;        // max ammo 1
    
const char    *pszAmmo2;    // ammo 2 type
    
int        iMaxAmmo2;        // max ammo 2
    
const char    *pszName;
    
int        iMaxClip;
    
int        iId;             
    
int        iFlags;          
    
int        iWeight;// this value used to determine this weapon's importance in autoselection.
ItemInfo
Como GetInfoItem tiene como parámetro una estructura llamada ItemInfo, la buscamos y obtenemos sus componentes digamos.

por eso se usa "OrpheuSetParamStructMember", porque estamos cambiando un miembro de esa estructura
__________________
Find my plugins here..

Ex - Spanish Moderator.
Starsailor is offline
Alucard^
AMXX Moderator: Others
Join Date: Sep 2007
Location: Street
Old 07-05-2010 , 17:18   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#7

Ahhh, copado... thx
__________________
Approved Plugins - Steam Profile

Public non-terminated projects:
All Admins Menu, HLTV parameters, Subnick,
Second Password (cool style), InfoZone,
Binary C4 plant/defuse, and more...

Private projects:
NoSpec (+menu), NV Surf Management,
PM Adanved System, KZ longjump2, and more...
Alucard^ is offline
Send a message via Skype™ to Alucard^
joaquimandrade
Veteran Member
Join Date: Dec 2008
Location: Portugal
Old 07-06-2010 , 15:00   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#8

Quote:
Originally Posted by Alucard^ View Post
After, en resumen, se podria decir que Orpheu sirve mas que nada para hacer cosas que no podes mediante otros modulos...
Si pero, con una reserva como Arkshine dije una vez:

Hay situaciones en que "puedes" usar otros modulos pero, es mejor usar orpheu como por ejemplo para bloquear lo fin de la ronda. Tienes plugins que lo hacen sin orpheu (con bots) pero es mucho mejor con orpheu porque es mas directo, mas eficiente y menos propenso a bugs.
__________________
joaquimandrade is offline
Alucard^
AMXX Moderator: Others
Join Date: Sep 2007
Location: Street
Old 07-06-2010 , 15:41   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#9

Quote:
Originally Posted by joaquimandrade View Post
Si pero, con una reserva como Arkshine dije una vez:

Hay situaciones en que "puedes" usar otros modulos pero, es mejor usar orpheu como por ejemplo para bloquear lo fin de la ronda. Tienes plugins que lo hacen sin orpheu (con bots) pero es mucho mejor con orpheu porque es mas directo, mas eficiente y menos propenso a bugs.
Claro, pero en el caso que diste... es como yo dije, que el orpheu se debe usar cuando no puedes hacer ciertas cosas con otros modulos... y en este caso seria el hecho de poder hacerlo sin usar bots (que por lo que yo se, no se puede hacer mediante otros modulos, no?).
__________________
Approved Plugins - Steam Profile

Public non-terminated projects:
All Admins Menu, HLTV parameters, Subnick,
Second Password (cool style), InfoZone,
Binary C4 plant/defuse, and more...

Private projects:
NoSpec (+menu), NV Surf Management,
PM Adanved System, KZ longjump2, and more...
Alucard^ is offline
Send a message via Skype™ to Alucard^
capostrike93
Veteran Member
Join Date: Feb 2009
Location: adios y??
Old 07-14-2010 , 03:13   Re: [ES][TUT] Hookear funciones virtuales con Orpheu
#10

Quote:
Originally Posted by Starsailor View Post
Esas son las funciones basicas, seria complicado usar este metodo para hookearlas, pero lo hice para que sepan hacerlo.
Por ejemplo, se pueden hookear otras funciones y hacer otros plugins.

PHP Code:
//Para que la ak-47 no se recargue sola, sino que la tenga que recargar el player.

#include <amxmodx>
#include <orpheu>

#define ITEM_FLAG_NOAUTORELOAD      2

public plugin_precache()
{
    
OrpheuRegisterHook(OrpheuGetFunctionFromClass("weapon_ak47","GetItemInfo","CBasePlayerItem"),"orpheu_iteminfo",OrpheuHookPost);
}

public 
orpheu_iteminfo(item,ItemInfo)
{
    
OrpheuSetParamStructMember(2,"iFlags",ITEM_FLAG_NOAUTORELOAD)

PHP Code:
//Para que la ak-47 este en el slot que yo quiera

#include <amxmodx>
#include <orpheu>

#define SLOT     3

public plugin_precache()
{
    
OrpheuRegisterHook(OrpheuGetFunctionFromClass("weapon_ak47","GetItemInfo","CBasePlayerItem"),"orpheu_iteminfo",OrpheuHookPost);
}

public 
orpheu_iteminfo(item,ItemInfo)
{
    
OrpheuSetParamStructMember(2,"iSlot",SLOT 1)

En este caso la signature va en

Code:
addons\amxmodx\configs\orpheu\virtualFunctions\CBasePlayerItem
Hay muchísimas mas funciones que se pueden hookear, pero estas son con las que probe.

Si tienen alguna duda o no entienden algo, pregunten.
orpheu_iteminfo(item,ItemInfo)

->

orpheu_iteminfo(idweapon,ItemInfo)

para que no se confundan con el item..
__________________
capostrike93 is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 21:49.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode