Post: How to call raw GSC Functions in an .sprx. Also, how to do waitill xD [RELEASE]
03-09-2015, 09:14 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 + 0x203Cool 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, 0x724C38 };
return GLS;
}
//TOC

Next we want to get all the Scr_Add functions together
    #define Scr_AddInt(Value) ((void(*)(int))&ParseAddr(0x20C60Cool Man (aka Tustin))(Value)
#define Scr_AddFloat(Value) ((void(*)(float))&ParseAddr(0x20C5C0))(Value)
#define Scr_AddString(String) ((void(*)(const char*))&ParseAddr(0x20C42Cool Man (aka Tustin))(String)
#define Scr_AddEntity(Entity) ((void(*)(int))&ParseAddr(0x1B7700))(Entity)
#define Scr_AddVector(Vec) ((void(*)(const float*))&ParseAddr(0x20C330))(Vec)


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

Here's how we do this.

First:
    #define Scr_ClearOutParams() ((void(*)(void))&ParseAddr(0x20C19Cool Man (aka Tustin))()


    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(0x1A80ECool Man (aka Tustin))(); //Call the actual function
//((void(*)(int))&ParseAddr(0x1A80ECool Man (aka Tustin))(ClientID << 16); //Only call this one if the one above doesn't work.
Scr_ClearOutParams();
}


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() - 0x20CC08 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(0x210A48, (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(0x200280))(StringValue)


    hookFunctionStart(0x20B7C8, (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(0x201F90))(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.
(adsbygoogle = window.adsbygoogle || []).push({});

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

-Numb, EternalHabit, GFM, iRnZ, JLM, lucasaf01, lutsch1234, MODZ4FUN420, John, PazzerHD, Psycedelic, SNMT| Havoc, SSM*, Swaqq, TehMerkMods, TheGreenPlanet, Wrafty, XenonLegend, xPurpBoyyx, zZHackzZ
08-07-2015, 01:30 PM #20
DudeCanMod
I am error
so whenever i try to call PlayerCMD_SayAll the Text string does not show up? It would say my name but not the text i put
03-01-2016, 06:22 PM #21
-JM-
Space Ninja
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 + 0x203Cool 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, 0x724C38 };
return GLS;
}
//TOC

Next we want to get all the Scr_Add functions together
    #define Scr_AddInt(Value) ((void(*)(int))&ParseAddr(0x20C60Cool Man (aka Tustin))(Value)
#define Scr_AddFloat(Value) ((void(*)(float))&ParseAddr(0x20C5C0))(Value)
#define Scr_AddString(String) ((void(*)(const char*))&ParseAddr(0x20C42Cool Man (aka Tustin))(String)
#define Scr_AddEntity(Entity) ((void(*)(int))&ParseAddr(0x1B7700))(Entity)
#define Scr_AddVector(Vec) ((void(*)(const float*))&ParseAddr(0x20C330))(Vec)


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

Here's how we do this.

First:
    #define Scr_ClearOutParams() ((void(*)(void))&ParseAddr(0x20C19Cool Man (aka Tustin))()


    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(0x1A80ECool Man (aka Tustin))(); //Call the actual function
//((void(*)(int))&ParseAddr(0x1A80ECool Man (aka Tustin))(ClientID << 16); //Only call this one if the one above doesn't work.
Scr_ClearOutParams();
}


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() - 0x20CC08 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(0x210A48, (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(0x200280))(StringValue)


    hookFunctionStart(0x20B7C8, (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(0x201F90))(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.


Some one knows How to patch the R13 like xx james t xx to use gsc functions outside a hook
03-01-2016, 07:50 PM #22
SC58
Former Staff
Originally posted by JM
Some one knows How to patch the R13 like xx james t xx to use gsc functions outside a hook


You are best to hook into a game function instead of trying to use a ppu thread, plus i remake every playercmd/scr/gscr function i use so it runs as if it's it own function

like playercmd_iprintln or whatever it is it pointless as poop to use scr_addstring to call it when u can just use servercommand

u can exec stuff from any function mostly no need to patch anything
03-02-2016, 03:46 AM #23
-JM-
Space Ninja
Originally posted by SC58 View Post
You are best to hook into a game function instead of trying to use a ppu thread, plus i remake every playercmd/scr/gscr function i use so it runs as if it's it own function

like playercmd_iprintln or whatever it is it pointless as poop to use scr_addstring to call it when u can just use servercommand

u can exec stuff from any function mostly no need to patch anything


hooks For me are unstable and causes some freeze :/ and It kills my style vibe that's why I was gonna try
GSCR functions sucks might as well call The G_ functions gscr calls G_giveweapon etc G_setfog and the others
Originally posted by SC58 View Post
Plus i remake every playercmd/scr/gscr function i use so it runs as if it's it own function

what do you mean ?
Like you read Ppc to make something similar in C++ ?
03-02-2016, 03:54 AM #24
SC58
Former Staff
Originally posted by JM
hooks For me are unstable and causes some freeze :/ and It kills my style vibe that's why I was gonna try
GSCR functions sucks might as well call The G_ functions gscr calls G_giveweapon etc G_setfog and the others

what do you mean ?
Like you read Ppc to make something similar in C++ ?


yeah, matter what you hook for it to be unstable plus how your coding is for a delay maybe
03-02-2016, 03:44 PM #25
-JM-
Space Ninja
Originally posted by SC58 View Post
yeah, matter what you hook for it to be unstable plus how your coding is for a delay maybe


Hay can you add me on skype like I feel no one can help in this forum anymore except a few cuz I start doing weird shit in ppc and trying new stuff mind adding me Skype:Jo-Milk
thanks
04-28-2016, 11:03 PM #26
ItzMatriix
Are you high?
Originally posted by SC58 View Post
You are best to hook into a game function instead of trying to use a ppu thread, plus i remake every playercmd/scr/gscr function i use so it runs as if it's it own function

like playercmd_iprintln or whatever it is it pointless as poop to use scr_addstring to call it when u can just use servercommand

u can exec stuff from any function mostly no need to patch anything


remake Player_Die so it actually works instead of freezing
04-29-2016, 12:59 AM #27
mrtn
Little One
Originally posted by ItzMatriix View Post
remake Player_Die so it actually works instead of freezing


Player_Die works perfectly fine lol
You have to call it in Scr_Notify/VM_Notify
04-29-2016, 03:58 AM #28
ItzMatriix
Are you high?
Originally posted by mrtn View Post
Player_Die works perfectly fine lol
You have to call it in Scr_Notify/VM_Notify


I do, and it still freezes.

Copyright © 2026, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo