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] */
- // ################################################################################### //
- /* Thanks to Ethernet. :) */
- // ################################################################################### //
- /* OP: http://adf.ly/19CbY9 */
- // ################################################################################### //
- // 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 + 0x1 = 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(0x2E8AE)(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
- 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. 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.
- // ################################################################################### //
- //BaSs_HaXoR
Add Comment
Please, Sign In to add comment