Jump to content

gattsuicu

Members
  • Posts

    1
  • Credits

  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by gattsuicu

  1. L2Server extend part

    IlExt.dll

    invoke CNpcSpeedLoad::Initialize() in dllmain

    Spoiler

    NpcSpeedLoad.h

    
    #pragma once
    
    class CNpcSpeedLoad {
    public:
    
    	static void Initialize() {
    		g_HookManager.WriteMemoryBYTE(0x6F1E28, 0xFF);
    		g_HookManager.WriteMemoryDWORD(0x6F1F74, 100);
    	}
    
    };

     

     

    L2Npc Extend part

    NpcExt.dll

    invoke CNpcSpeedLoad::Initialize() in dllmain

    Spoiler

    NpcSpeedLoad.h

    
    #pragma once
    
    //C - class name
    //M - method name
    //A - address
    //RT - return type
    //... - method signature
    #define mdef(C, M, A, CC, RT, ...)\
    	const uintptr_t M_##C##__##M = (uintptr_t) A;\
    	typedef RT ( CC * M_##C##__##M##_T ) (C*, __VA_ARGS__);
    
    //C - class name
    //M - method name
    //This - pointer to C
    //... method parameters
    #define invoke(C, M, This, ...)\
    	( M_##C##__##M##_T ( M_##C##__##M ) ) (This, __VA_ARGS__)
    
    class CNpcMakerDB;
    class CNpcSpeedLoad;
    class CNpcEx;
    
    mdef(CNpcMakerDB, ProcessOneNpcMaker, 0x5517D0, __fastcall, bool)
    mdef(CNpcMakerDB, ProcessOneNpcMakerEx, 0x551BF0, __fastcall, bool)
    mdef(CNpcMakerDB, AddTimer, 0x47F0D0, __fastcall, bool, int, int)
    mdef(CNpcMakerDB, TimerExpired, 0x551A10, __fastcall, void, int)
    
    mdef(CNpcEx, AddTimer, 0x47F0D0, __fastcall, bool, int, int);
    
    class CNpcSpeedLoad {
    public:
    
    	static void Initialize();
    
    };
    
    
    class CNpcEx {
    public:
    	bool AddTimer(int delay, int id) {
    		return invoke(CNpcEx, AddTimer, this, delay, id);
    	}
    
    	static bool EnterWorld__AddTimer(CNpcEx* This, int delay, int id) {
    		return This->AddTimer(0, id);
    	}
    };
    
    class CNpcMakerDB {
    public:
    
    	bool ProcessOneNpcMaker() {
    		return invoke(CNpcMakerDB, ProcessOneNpcMaker, this);
    	}
    
    	bool ProcessOneNpcMakerEx() {
    		return invoke(CNpcMakerDB, ProcessOneNpcMakerEx, this);
    	}
    
    	bool AddTimer(int delay, int id) {
    		return invoke(CNpcMakerDB, AddTimer, this, delay, id);
    	}
    	
    	void TimerExpired(int id) {
    		return invoke(CNpcMakerDB, TimerExpired, this, id);
    	}
    
    	static void TimerExpiredHook(CNpcMakerDB* This, int id);
    };

     

    NpcSpeedLoad.cpp

    
    #include "StdAfx.h"
    #include "NpcSpeedLoad.h"
    #include "Utils.h"
    
    void CNpcSpeedLoad::Initialize() {
    	//define hooks
    	//hook vtable CNpcMakerDB::TimerExpired
    	WriteQWORD(0x6B8E80, uintptr_t(CNpcMakerDB::TimerExpiredHook));
    	//CNpc::EnterWorld -> AddTimer
    	WriteCall(0x4D1BBB, CNpcEx::EnterWorld__AddTimer);
    }
    
    void CNpcMakerDB::TimerExpiredHook(CNpcMakerDB* This, int id) {
    	try {
    		if(id == 1) {
    			bool result = true;
    			for(int i = 0 ; i < 256 && (result = This->ProcessOneNpcMaker()) ; i++);
    			if(!result) {
    				((int*) This)[180] = 0;//boolean tell if loading CNpcMaker
    				g_Log.Add(LogBlue, "ProcessOneNpcMaker processing finish!");
    				This->AddTimer(100, 2);
    			} else
    				This->AddTimer(100, 1);
    		} else if(id == 2) {
    			bool result = true;
    			for(int i = 0 ; i < 256 && (result = This->ProcessOneNpcMakerEx()) ; i++);
    			if(result)
    				This->AddTimer(100, 2);
    			else
    				g_Log.Add(LogBlue, "ProcessOneNpcMakerEx processing finish!");
    		}
    	} catch(...) {
    		g_Log.Add(LogError, L"%s error", __FUNCTIONW__);
    	}
    }

     

    • Thanks 1
×
×
  • Create New...