Post: How to call raw GSC Functions in an .sprx. Also, how to do waitill xD [RELEASE]
03-09-2015, 06:50 PM #1
(adsbygoogle = window.adsbygoogle || []).push({}); Sup guys, if you don't know me, good. I'm from xbox xD. My alias is Maybe Ethernet. I'll be showing you how to call raw gsc functions in your dll/sprx.

Ok so first we want to get our basic functions

    int Scr_SetParameters(unsigned int Num){
return *(int*)(0x13C3140 + 0x1Cool Man (aka Tustin) = Num;
}
//This will set the parameter number

    struct opd_s{
uint Sub;
uint Toc;
};


    opd_s ParseAddr(int Address){
opd_s GLS = { Address, 0xA7F3C8 };
return GLS;
}
//TOC

Next we want to get all the Scr_Add functions together
    #define Scr_AddInt(Value) ((void(*)(int))&ParseAddr(0x2E8AECool Man (aka Tustin))(Value)
#define Scr_AddFloat(Value) ((void(*)(float))&ParseAddr(0x2E8BE4))(Value)
#define Scr_AddString(String) ((void(*)(const char*))&ParseAddr(0x2E91EC))(String)
#define Scr_AddEntity(Entity) ((void(*)(int))&ParseAddr(0x28B1CC))(Entity)
#define Scr_AddVector(Vec) ((void(*)(const float*))&ParseAddr(0x2E952C))(Vec)


Now to explain how to actually use these, we're going to use GScr_Earthquake as an example which is located at 0x268B60.

Here's how we do this.

    void GScr_Earthquake(float scale, float duration, float* source, float radius){
Scr_AddFloat(radius);
Scr_AddVector(source);
Scr_AddFloat(duration);
Scr_AddFloat(scale);
Scr_SetParameters(4); //See how I set the parameter number after I finish calling the Scr_Adds?
((void(*)())&ParseAddr(0x268B60))(); //Call the actual function
//((void(*)(int))&ParseAddr(0x268B60))(ClientID << 16); //Only call this one if the one above doesn't work.
}


See how I called the Scr_Adds from the last parameter to the 1st one? Well you have to do that, idk why really.

Now on to the hook. You need somewhere to call these right? Well your answer is: VM_Resume - 0x2E69C4.

Method to hook: hookFunctionStart - Credit to Xx jAmes t xX for porting this Smile

    void PatchInJump(int Address, int Destination){
int FuncBytes[4];
Destination = *(int*)Destination;
FuncBytes[0] = 0x3D600000 + ((Destination >> 16) & 0xFFFF);
if(Destination & 0x8000) FuncBytes[0] += 1;
FuncBytes[1] = 0x396B0000 + (Destination & 0xFFFF);
FuncBytes[2] = 0x7D6903A6;
FuncBytes[3] = 0x4E800420;
Memcpy((void*)Address, FuncBytes, 4*4);
}


    void hookFunctionStart(int Address, int saveStub, int Destination){ //Works on every game
saveStub = *(int*)saveStub;
int BranchtoAddress = Address + (4*4);
int StubData[8];
StubData[0] = 0x3D600000 + ((BranchtoAddress >> 16) & 0xFFFF);
if(BranchtoAddress & 0x8000) StubData[0] += 1;
StubData[1] = 0x396B0000 + (BranchtoAddress & 0xFFFF);
StubData[2] = 0x7D6903A6;
Memcpy(&StubData[3], (void*)Address, 4*4);
StubData[7] = 0x4E800420;
Memcpy((void*)saveStub, StubData, 8*4);
PatchInJump(Address, Destination);
}


Now our function hook

    void VM_ResumeStub(int TimeId){
__asm("li %r3, 0x3");
}


    void VM_ResumeHook(int TimeId){ // If this doesn't work, hook int VM_Execute() - 0x2E6444 with hookFunctionStart
//You would call GScr_Earthquake here. Obv not in the loop. Make sure you implement a check in here to make it // get called once
VM_ResumeStub(TimeId);
}


To call our hook we do
    hookFunctionStart(0x2E69C4, (int)VM_ResumeStub, (int)VM_ResumeHook);

Make sure you call that about 2 seconds after your thread is executed.


Now that's it. Smile Also, you can call other things like:

PlayerCmd_ClonePlayer
PlayerCmd_Suicide
Player_Die
G_RadiusDamage
GScr_NotifyOnPlayerCommand //Someone find this for me on ghosts pls ;-;
G_Damage
and many more!

Now on to waitill. Pretty easy tbh.

First
    #define SL_ConvertToString(StringValue) ((const char*(*)(unsigned short))ParseAddr(0x2D894C))(StringValue)


    hookFunctionStart(0x2E1970, (int)VM_NotifyStub, (int)VM_NotifyHook);


    void VM_NotifyStub(unsigned int self, short Stringvalue, unsigned int Paramcount){
__asm("li %r3, 0x4");
}


    void VM_NotifyHook(unsigned int self, short Stringvalue, unsigned int Paramcount){
//Now if we wanted to monitor onPlayerSpawned we do
int ClientID = ((int(*)(int))&ParseAddr(0x2DBF60))(self); //Scr_GetSelf
const char* Notify = SL_ConvertToString(Stringvalue);
if(!strcmp(Notify, "spawned_player")){
//Executed on spawn. This monitors for ANY CLIENT THAT SPAWNS!
GScr_Earthquake(0.6f, 2, (float*)(Playerstate() + 0x1C), 800); //Yes you can call this in V
}
VM_NotifyStub(self, Stringvalue, Paramcount);
}


That's pretty much it :P This works for all cods the same way as it works for this. Just update the offsets.
Last edited by Ambition sG ; 03-09-2015 at 07:13 PM.

The following 25 users say thank you to Ambition sG for this useful post:

/SneakerStreet/, Absolute Zero, B777x, BaSs_HaXoR, CIA agent, Sabotage, EternalHabit, FusionIsDaName, Geo, GFM, iMoD1998, Welsh, JAKE_1496, JLM, MODZ4FUN420, John, o0kiddik0o™, pktman12345, RouletteBoi, Sunnis, Swaqq, TotalModzHD, XenonLegend, Xx_GANG_xX
03-09-2015, 06:53 PM #2
ewwwwwwwwwwwwwwwww
03-09-2015, 07:00 PM #3
Sabotage
Gaming Squad
ewwwwwwwwwwwwwwwwwwwww
03-09-2015, 07:07 PM #4
Originally posted by Ambition
Sup guys, if you don't know me, good. I'm from xbox xD. My alias is Maybe Ethernet. I'll be showing you how to call raw gsc functions in your dll/sprx.

Ok so first we want to get our basic functions

int Scr_SetParameters(unsigned int Num){
return *(int*)(0x13C3140 + 0x1Cool Man (aka Tustin) = Num;
}//This will set the parameter number

struct opd_s{
uint Sub;
uint Toc;
};

opd_s ParseAddr(int Address){
opd_s GLS = { Address, 0xA7F3C8 };
return GLS;
}//TOC

Next we want to get all the Scr_Add functions together
#define Scr_AddInt(Value) ((void(*)(int))&ParseAddr(0x2E8AECool Man (aka Tustin))(Value)
#define Scr_AddFloat(Value) ((void(*)(float))&ParseAddr(0x2E8BE4))(Value)
#define Scr_AddString(String) ((void(*)(const char*))&ParseAddr(0x2E91EC))(String)
#define Scr_AddEntity(Entity) ((void(*)(int))&ParseAddr(0x28B1CC))(Entity)
#define Scr_AddVector(Vec) ((void(*)(const float*))&ParseAddr(0x2E952C))(Vec)

Now to explain how to actually use these, we're going to use GScr_Earthquake as an example which is located at 0x268B60.

Here's how we do this.

void GScr_Earthquake(float scale, float duration, float* source, float radius){
Scr_AddFloat(radius);
Scr_AddVector(source);
Scr_AddFloat(duration);
Scr_AddFloat(scale);
Scr_SetParameters(4); //See how I set the parameter number after I finish calling the Scr_Adds?
((void(*)())&ParseAddr(0x268B60))(); //Call the actual function
//((void(*)(int))&ParseAddr(0x268B60))(ClientID << 16); //Only call this one if the one above doesn't work.
}

See how I called the Scr_Adds from the last parameter to the 1st one? Well you have to do that, idk why really.

Now on to the hook. You need somewhere to call these right? Well your answer is: VM_Resume - 0x2E69C4.

Method to hook: hookFunctionStart - Credit to Xx jAmes t xX for porting this Smile

void PatchInJump(int Address, int Destination){
int FuncBytes[4];
Destination = *(int*)Destination;
FuncBytes[0] = 0x3D600000 + ((Destination >> 16) & 0xFFFF);
if(Destination & 0x8000) FuncBytes[0] += 1;
FuncBytes[1] = 0x396B0000 + (Destination & 0xFFFF);
FuncBytes[2] = 0x7D6903A6;
FuncBytes[3] = 0x4E800420;
Memcpy((void*)Address, FuncBytes, 4*4);
}


void hookFunctionStart(int Address, int saveStub, int Destination){ //Works on every game
saveStub = *(int*)saveStub;
int BranchtoAddress = Address + (4*4);
int StubData[8];
StubData[0] = 0x3D600000 + ((BranchtoAddress >> 16) & 0xFFFF);
if(BranchtoAddress & 0x8000) StubData[0] += 1;
StubData[1] = 0x396B0000 + (BranchtoAddress & 0xFFFF);
StubData[2] = 0x7D6903A6;
Memcpy(&StubData[3], (void*)Address, 4*4);
StubData[7] = 0x4E800420;
Memcpy((void*)saveStub, StubData, 8*4);
PatchInJump(Address, Destination);
}

Now our function hook

void VM_ResumeStub(int TimeId){
__asm("li %r3, 0x3");
}

void VM_ResumeHook(int TimeId){ // If this doesn't work, hook int VM_Execute() - 0x2E6444 with hookFunctionStart
//You would call GScr_Earthquake here. Obv not in the loop. Make sure you implement a check in here to make it // get called once
VM_ResumeStub(TimeId);
}

To call our hook we do hookFunctionStart(0x2E69C4, (int)VM_ResumeStub, (int)VM_ResumeHook);
Make sure you call that about 2 seconds after your thread is executed.


Now that's it. Smile Also, you can call other things like:

PlayerCmd_ClonePlayer
PlayerCmd_Suicide
Player_Die
G_RadiusDamage
GScr_NotifyOnPlayerCommand //Someone find this for me on ghosts pls ;-;
G_Damage
and many more!

Now on to waitill. Pretty easy tbh.

First #define SL_ConvertToString(StringValue) ((const char*(*)(unsigned short))ParseAddr(0x2D894C))(StringValue)

hookFunctionStart(0x2E1970, (int)VM_NotifyStub, (int)VM_NotifyHook);

void VM_NotifyStub(unsigned int self, short Stringvalue, unsigned int Paramcount){
__asm("li %r3, 0x4");
}

void VM_NotifyHook(unsigned int self, short Stringvalue, unsigned int Paramcount){
//Now if we wanted to monitor onPlayerSpawned we do
int ClientID = ((int(*)(int))&ParseAddr(0x2DBF60))(self); //Scr_GetSelf
const char* Notify = SL_ConvertToString(Stringvalue);
if(!strcmp(Notify, "spawned_player")){
//Executed on spawn. This monitors for ANY CLIENT THAT SPAWNS!
GScr_Earthquake(0.6f, 2, (float*)(Playerstate() + 0x1C), 800); //Yes you can call this in V
}
VM_NotifyStub(self, Stringvalue, Paramcount);
}

That's pretty much it :P This works for all cods the same way as it works for this. Just update the offsets.


You're awesome! Smile
I don't have time to mod as much anymore, but if I ever have time I definitely will be checking this out! Smile
03-09-2015, 07:09 PM #5
iMoD1998
Pokemon Trainer
Great Work Man <3
03-09-2015, 07:17 PM #6
Sunnis
Mario!
Biggest weeaboo of them all af
03-09-2015, 09:22 PM #7
GFM
Can’t trickshot me!
@sunnis i agree

Anyway nice ethernet Happy

The following user thanked GFM for this useful post:

Sunnis
03-10-2015, 12:01 PM #8
lutsch1234
Bounty hunter
Originally posted by Ambition
Sup guys, if you don't know me, good. I'm from xbox xD. My alias is Maybe Ethernet. I'll be showing you how to call raw gsc functions in your dll/sprx.

Ok so first we want to get our basic functions

    int Scr_SetParameters(unsigned int Num){
return *(int*)(0x13C3140 + 0x1Cool Man (aka Tustin) = Num;
}
//This will set the parameter number

    struct opd_s{
uint Sub;
uint Toc;
};


    opd_s ParseAddr(int Address){
opd_s GLS = { Address, 0xA7F3C8 };
return GLS;
}
//TOC

Next we want to get all the Scr_Add functions together
    #define Scr_AddInt(Value) ((void(*)(int))&ParseAddr(0x2E8AECool Man (aka Tustin))(Value)
#define Scr_AddFloat(Value) ((void(*)(float))&ParseAddr(0x2E8BE4))(Value)
#define Scr_AddString(String) ((void(*)(const char*))&ParseAddr(0x2E91EC))(String)
#define Scr_AddEntity(Entity) ((void(*)(int))&ParseAddr(0x28B1CC))(Entity)
#define Scr_AddVector(Vec) ((void(*)(const float*))&ParseAddr(0x2E952C))(Vec)


Now to explain how to actually use these, we're going to use GScr_Earthquake as an example which is located at 0x268B60.

Here's how we do this.

    void GScr_Earthquake(float scale, float duration, float* source, float radius){
Scr_AddFloat(radius);
Scr_AddVector(source);
Scr_AddFloat(duration);
Scr_AddFloat(scale);
Scr_SetParameters(4); //See how I set the parameter number after I finish calling the Scr_Adds?
((void(*)())&ParseAddr(0x268B60))(); //Call the actual function
//((void(*)(int))&ParseAddr(0x268B60))(ClientID << 16); //Only call this one if the one above doesn't work.
}


See how I called the Scr_Adds from the last parameter to the 1st one? Well you have to do that, idk why really.

Now on to the hook. You need somewhere to call these right? Well your answer is: VM_Resume - 0x2E69C4.

Method to hook: hookFunctionStart - Credit to Xx jAmes t xX for porting this Smile

    void PatchInJump(int Address, int Destination){
int FuncBytes[4];
Destination = *(int*)Destination;
FuncBytes[0] = 0x3D600000 + ((Destination >> 16) & 0xFFFF);
if(Destination & 0x8000) FuncBytes[0] += 1;
FuncBytes[1] = 0x396B0000 + (Destination & 0xFFFF);
FuncBytes[2] = 0x7D6903A6;
FuncBytes[3] = 0x4E800420;
Memcpy((void*)Address, FuncBytes, 4*4);
}


    void hookFunctionStart(int Address, int saveStub, int Destination){ //Works on every game
saveStub = *(int*)saveStub;
int BranchtoAddress = Address + (4*4);
int StubData[8];
StubData[0] = 0x3D600000 + ((BranchtoAddress >> 16) & 0xFFFF);
if(BranchtoAddress & 0x8000) StubData[0] += 1;
StubData[1] = 0x396B0000 + (BranchtoAddress & 0xFFFF);
StubData[2] = 0x7D6903A6;
Memcpy(&StubData[3], (void*)Address, 4*4);
StubData[7] = 0x4E800420;
Memcpy((void*)saveStub, StubData, 8*4);
PatchInJump(Address, Destination);
}


Now our function hook

    void VM_ResumeStub(int TimeId){
__asm("li %r3, 0x3");
}


    void VM_ResumeHook(int TimeId){ // If this doesn't work, hook int VM_Execute() - 0x2E6444 with hookFunctionStart
//You would call GScr_Earthquake here. Obv not in the loop. Make sure you implement a check in here to make it // get called once
VM_ResumeStub(TimeId);
}


To call our hook we do
    hookFunctionStart(0x2E69C4, (int)VM_ResumeStub, (int)VM_ResumeHook);

Make sure you call that about 2 seconds after your thread is executed.


Now that's it. Smile Also, you can call other things like:

PlayerCmd_ClonePlayer
PlayerCmd_Suicide
Player_Die
G_RadiusDamage
GScr_NotifyOnPlayerCommand //Someone find this for me on ghosts pls ;-;
G_Damage
and many more!

Now on to waitill. Pretty easy tbh.

First
    #define SL_ConvertToString(StringValue) ((const char*(*)(unsigned short))ParseAddr(0x2D894C))(StringValue)


    hookFunctionStart(0x2E1970, (int)VM_NotifyStub, (int)VM_NotifyHook);


    void VM_NotifyStub(unsigned int self, short Stringvalue, unsigned int Paramcount){
__asm("li %r3, 0x4");
}


    void VM_NotifyHook(unsigned int self, short Stringvalue, unsigned int Paramcount){
//Now if we wanted to monitor onPlayerSpawned we do
int ClientID = ((int(*)(int))&ParseAddr(0x2DBF60))(self); //Scr_GetSelf
const char* Notify = SL_ConvertToString(Stringvalue);
if(!strcmp(Notify, "spawned_player")){
//Executed on spawn. This monitors for ANY CLIENT THAT SPAWNS!
GScr_Earthquake(0.6f, 2, (float*)(Playerstate() + 0x1C), 800); //Yes you can call this in V
}
VM_NotifyStub(self, Stringvalue, Paramcount);
}


That's pretty much it :P This works for all cods the same way as it works for this. Just update the offsets.

Could you maybe release a source so People can understand this a littel bit better.
By the way great work Keep it up <3
03-10-2015, 05:26 PM #9
Originally posted by lutsch1234 View Post
Could you maybe release a source so People can understand this a littel bit better.
By the way great work Keep it up <3


It's all there. Just c&p it in your source. I went full n00b on this post, so I don't know how you don't understand that O.o
03-10-2015, 05:37 PM #10
lutsch1234
Bounty hunter
Originally posted by Ambition
It's all there. Just c&p it in your source. I went full n00b on this post, so I don't know how you don't understand that O.o

i tried it on mw2 everything is fine i can build it but until i start the game i keeps saying awaitig challeng 2... i only have the earthquake function in it the same for ghost and i dont know why

Copyright © 2024, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo