Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ############################################################################################### //
- /* How to call raw GSC Functions in an .sprx. Also, how to do waitill xD [RELEASE] */
- // ############################################################################################### //
- /* Credits: Ethernet */
- // ############################################################################################### //
- /*
- How to call raw GSC Functions in an .sprx. Also, how to do waitill xD [RELEASE]
- 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 + 0x2038) = 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(0x20C608))(Value)
- #define Scr_AddFloat(Value) ((void(*)(float))&ParseAddr(0x20C5C0))(Value)
- #define Scr_AddString(String) ((void(*)(const char*))&ParseAddr(0x20C428))(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 0x268B60.
- // Here's how we do this.
- // First:
- #define Scr_ClearOutParams() ((void(*)(void))&ParseAddr(0x20C19)()
- 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(0x1A80E8))(); //Call the actual function
- //((void(*)(int))&ParseAddr(0x1A80E8))(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
- 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(0x2E69C4, (int)VM_ResumeStub, (int)VM_ResumeHook);
- // Make sure you call that about 2 seconds after your thread is executed.
- // ############################################################################################### //
- // Now that's it. 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)
- Code:
- hookFunctionStart(0x20B7C8, (int)VM_NotifyStub, (int)VM_NotifyHook);
- Code:
- 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.
- /* ############################################################################################### */
- //BaSs_HaXoR
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement