[Development] MiniMap Source Code (2016) to: 1.04.04 GMO

Page 1 of 2 12 LastLast
Results 1 to 15 of 26
  1. #1
    Darkness Member Kiosani is offline
    MemberRank
    Oct 2007 Join Date
    ArgentinaLocation
    1,276Posts

    happy [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Well I must create a new Thread, because.. on: bet0x thread.. I make spam (Sorry for this bro).. then here I leave a new & complete MiniMap Source Code (to client side), with offsets/information registers and etc to: 1.04.04 GMO (as I say on the thread title).

    MiniMap.cpp file:
    Code:
    #include "stdafx.h"
    #include "MiniMap.h"
    #include "TMemory.h"
    #include "Interface.h"
    
    // Buffers -> Using this method.. is not necesary mov esi, 0x00XXX or: mov edi, //0x00XX and prevents.. possible problems with information registers
    
    
    DWORD LoadImg1	= 0x007721E0;
    DWORD LoadMap1	= 0x00860FC0;
    DWORD LoadMap2	= 0x008615F0;
    DWORD LoadMap3	= 0x00886C20;
    DWORD LoadMap4	= 0x004E65C0;
    
    
    MiniMap		gMiniMap; //Small MiniMap Class Initialization (Only for: Hook Main Function)
    
    
    bool IsValidMap(int MapId)
    {
    	char FullMapName[200];
    	sprintf_s(FullMapName, "World%d\\Map1.jpg", MapId + 1);
    
    
    	struct stat buffer;
    
    
    	if (stat(FullMapName, &buffer)) // -> On this way Minimap not have crashs on Event Maps... xD
    	{
    		switch (MapId)
    		{
    		case 0: return true;//Lorencia
    		case 1: return true;//Dungeon
    		case 2: return true;//Devias
    		case 3: return true;//Noria
    		case 4: return true;//LostTower
    		case 6: return true;//Stadium
    		case 7: return true;//Atlans
    		case 8: return true;//Tarkan
    		case 10: return true;//Icarus
    		case 24: return true;//Kalima 1
    		case 25: return true;//Kalima 2
    		case 26: return true;//Kalima 3
    		case 27: return true;//Kalima 4
    		case 28: return true;//Kalima 5
    		case 29: return true;//Kalima 6
    		case 30: return true;//Valley of Loren
    		case 31: return true;//Land of Trials
    		case 33: return true;//Aida
    		case 34: return true;//Crywolf
    		case 36: return true;//Kanturu 1
    		case 37: return true;//Kanturu 2
    		case 38: return true;//Kanturu 3
    		case 42: return true;//Barracks
    		case 51: return true;//Elbeland
    		case 56: return true;//Swamp of Calmness
    		case 57: return true;//Raklion
    		case 58: return true;//Raklion Boss
    		case 63: return true;//Vulcanus
    		case 80: return true;//Kalrutan 1
    		case 81: return true;//Kalrutan 2
    
    
    		// Invalid MiniMap
    		default: return false;
    		}
    	}
    	return false;
    }
    
    
    void LoadImageJpgForMap(char* ImagePatch, DWORD PrintCode)
    {
    	_asm
    	{
    		PUSH 0
    		PUSH 1
    		PUSH 0x2900
    		PUSH 0x2601
    		PUSH 0x7B7A
    		PUSH ImagePatch
    		CALL LoadImg1 // -> Here is not used: mov edi and anothers bad instructions to memory is only direct CALL to Main Offset :D:
    		ADD ESP,0x18
    	}
    }
    
    
    int LoadMap(int Map)
    {
    	char FullMapName[200];
    	sprintf(FullMapName, "World%d\\Map1.jpg", Map + 1);
    	ChangePath(FullMapName);
    	LoadImageJpgForMap(FullMapName, 0x7B7A);
    	return Map;
    }
    
    
    void ChangePath(const char* Map)
    {
    	memset((DWORD*)0xD4A654, 0, 19);
    	memcpy((DWORD*)0xD4A654, Map, 17);
    }
    
    
    bool MapCheckerCore1(int Map)
    {
    	if (IsValidMap(Map))
    	{
    		return 1;
    	}
    	return 0;
    }
    
    
    void MapCheckerCore2(int Map)
    {
    	if (IsValidMap(Map))
    	{
    		LoadMap(Map);
    
    
    		_asm
    		{
    			CALL LoadMap1
    			MOV ECX, EAX
    			CALL LoadMap2
    			MOV ECX, EAX
    			CALL LoadMap3
    		}
    	}
    
    
    	_asm
    	{
    		PUSH Map
    		CALL LoadMap4 // -> Here on: 1.04d main.exe is not necesary POP EBP instruction.. I don't know why ^^ I like think that is by call convention type (__cdecl or __stdcall on original main function).
    	}
    }
    
    
    #define oMapCheckerHook1	0x007D3B6D
    #define oMapCheckerHook2	0x00886B87
    #define oMapCheckerHook3	0x0062EB3D
    
    
    //--------------------------------------------------------------------------------------------
    // Cool Info ^^
    //--------------------------------------------------------------------------------------------
    #define oMiniMapKeyPushOffset	0x007D3B55	//0x09 = TAB - 0x10 = SHIFT
    #define oMiniMapKeyCallOffset	0x007D3B6D	//This call must be hook to MapCheckerCore1 proc
    // -------------------------------------------------------------------------------------------
    #define oScreenMapKeyOffset		0x007D3BA5	//0x09 = TAB - 0x10 = SHIFT
    
    
    void MiniMap::Load()
    {
    	SetOp((LPVOID)oMapCheckerHook1, (LPVOID)MapCheckerCore1, ASM::CALL);
    	SetOp((LPVOID)oMapCheckerHook2, (LPVOID)MapCheckerCore1, ASM::CALL);
    	SetOp((LPVOID)oMapCheckerHook3, (LPVOID)MapCheckerCore2, ASM::CALL);
    }
    MiniMap.h file:
    Code:
    #pragma once
    // ----------------------------------------------------------------------------------------------
    
    
    #include "Import.h" // -> This is not necesary.. on my zClient Modified Source I only use this.. to make a small new mod (is TEST) xD
    
    // ----------------------------------------------------------------------------------------------
    
    
    int		LoadMap(int Map);
    void		LoadImageJpgForMap(char* ImagePath, DWORD PrintCode);
    bool		MapCheckerCore1(int Map);
    void		MapCheckerCore2(int Map);
    void		ChangePath(const char*Map);
    bool		IsValidMap(int MapId);
    
    
    class MiniMap
    {
    public:
    	void		Load();
    	// ----
    }; extern MiniMap gMiniMap;
    PS: Sorry I don't make a external HOOK Function to change MiniMap Key... but if you change this "PUSH 9" offset: #define oMiniMapKeyPushOffset 0x007D3B55,
    directly with ollydbg on your main.exe then.. your MINIMAP is SHOW/HIDE
    using: Shift Keys (PUSH 10) or you can change too:
    oScreenMapKeyPushOffset (is the same), but for this exists a small check
    function into the main.. I mean a: "JNZ" instruction.. you must change
    this too or your: Screen Map is not Close event using: Shift key xD.

    PS 2: And I leave here my cool: "Patch" to any Client: 1.04d version, to
    put MiniMaps on every: "WorldXX" Folder.. with every Mini Image
    (Remaked from: ScreenMaps TGA and converted to: JPG, have better
    quality)..

    https://mega.nz/#!aJYWjLIC!FR0JFdtE0...jod6P5642gFTsU


  2. #2
    Apprentice maihieptn is offline
    MemberRank
    Dec 2013 Join Date
    7Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    if (stat(FullMapName, &buffer))
    Error1error C2661: 'stat::stat' : no overloaded function takes 2 argument

    Help me !

  3. #3
    O_o psychedelic is offline
    MemberRank
    Nov 2013 Join Date
    LatviaLocation
    270Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by maihieptn View Post
    if (stat(FullMapName, &buffer))
    Error1error C2661: 'stat::stat' : no overloaded function takes 2 argument

    Help me !
    #include <sys\stat.h>

  4. #4
    Account Upgraded | Title Enabled! phgkhh is offline
    MemberRank
    Dec 2009 Join Date
    395Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by mauro07 View Post
    I don't know why you have this problem bro, since.. my zMain.exe + my zClient.dll (Modified) works fine.. but I thinks that maybe you don't have on your: "dllmain.cpp" this:

    Code:
    extern "C" __declspec(dllexport)void Init()
    {
    	DWORD OldProtect;
        // ----
        if(VirtualProtect(LPVOID(0x00401000),0x00D21FFF,PAGE_EXECUTE_READWRITE,&OldProtect))
        {
    		#ifdef __NOVUS__
    		gCraftSystem.Load();
    		#endif
    		gConnectEx.Load();
    		gController.Load();
    		gChatExpanded.Load();
    		gItemPrice.Load();
    		gItem.Load();
    		gResetSystem.Load();
    		gProtocol.Load();
    		gObjUser.Load();
    		gOther.Load();
    		gMiniMap.Load();
    		gInterface.Load();
    		gVisualFix.InitVisualFix();
    		g_ItemModel.Load();
    		gOffTrade.Init();
    		gMonster.Load();
    		//gCheatGuard.Load();
    		//gSocketItem.Load();
    		// -----
    		ItemAsmLoad();
    		InitRotateDmg();
    		gFiltersInit();
    		// -----
    		#ifdef __RMOS__
    		g_ItemRank.Load(); 
    		#endif
    		// ----
    		//char szTemp[256];
    		//sprintf(szTemp,"OBJECT size is 0x%02X", sizeof(OBJECT));
    		//MessageBox(HWND_DESKTOP,szTemp,NULL,MB_OK);
    		// ----
    		LoadLibrary("Item.dll");
    		LoadLibrary("Glow.dll");
    	}
    }
    // ----------------------------------------------------------------------------------------------
    
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
    {
    	switch(dwReason)
    	{
    	case DLL_PROCESS_DETACH:
    		{
    			// --
    		}
    		break;
    		// --
    	case DLL_PROCESS_ATTACH:
    		{
    			gController.Instance = hModule;
    		}
    		break;
    	}
    	// ----
    	return true;
    }
    // ----------------------------------------------------------------------------------------------
    PS: VirtualProtect Offset from: 1.04d GMO main.exe (Original, I mean.. is the last main.exe Memory offset for this version)... on this case you are using a custom: "Class" to include MiniMap to source -> "gMiniMap.Load();" but.. is necesary load all memory into the range memory offsets, and you can add on your: "MiniMap.cpp" file this:



    PS 2: Temp fix made by:
    psychedelic

    PS 3: Since.. this: POP EBP instruction on my: zClient.dll Source.. is make Crash to my 1.04d GMO main.exe.. then I move it.
    Hi mauro,

    It does not work for me, still have zMain.exe in the process after exit the game, and it takes 50mb of memory :( Adding the POP EBP also cause my main to crash, same as your. Here is my dllmain.cpp:

    Code:
    extern "C" __declspec(dllexport)void Init()
    {
    	DWORD OldProtect;
    	// ----
        if(VirtualProtect(LPVOID(0x401000),0x00D21FFF,PAGE_EXECUTE_READWRITE,&OldProtect))
        {
    #ifdef __NOVUS__
    	gCraftSystem.Load();
    #endif
    	#ifdef __RMOS__
    	g_ItemRank.Load(); 
    #endif
    	gConnectEx.Load();
    	gController.Load();
    	gChatExpanded.Load();
    	gItemPrice.Load();
    	gItem.Load();
    	gResetSystem.Load();
    	gProtocol.Load();
    	gCheatGuard.Load();
    	gObjUser.Load();
    	gOther.Load();
    	gInterface.Load();
    	gVisualFix.InitVisualFix();
    	g_ItemModel.Load();	
    	gOffTrade.Init();
    	gSocketItem.Load();
    
    // Custom added
    	CustomBowsLoad();
    	ItemGlowLoad();
    	ItemEffectLoad();
    	SetSmokeEffectLoad();
    	gMiniMap.Load();
    
    // Loading .DLL
    	LoadLibrary("ttlci.dll");	
    	LoadLibrary("opengl32.dll");
        }
    }

  5. #5
    Valued Member ikenylee is offline
    MemberRank
    Apr 2011 Join Date
    145Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    here source Sky

    .cpp
    Code:
    #include "StdAfx.h"
    #include "SkyBox.h"
    #include "ToolKit.h"
    #include "Config.h"
    struct FRGB
    {
    	float r, g, b;
    };
    
    FRGB skycolor;
    
    unsigned int textures[32][6];
    
    bool DisplayInitialized;
    
    typedef int(*TSkyHook)();
    TSkyHook SkyHook = (TSkyHook)0x005B9260;		//1.03k
    
    typedef int(*TBlend) (int);
    TBlend Blend = (TBlend)0x00635FD0;		//1.03k
    
    typedef int(*TUnBlend) ();
    TUnBlend UnBlend = (TUnBlend)0x00635F50;		//1.03k
    
    int *MainState = (int*)0x00E609E8;			//1.03k
    int *Map = (int*)0x00E61E18;			//1.03k
    
    void ChangeSky()
    {
    	SYSTEMTIME sm;
    	GetLocalTime(&sm);
    
    	int hourstate = sm.wHour % 2;
    	float minutestate = (float)sm.wMinute / 60.0f;
    
    	if (hourstate == 0)
    	{
    		skycolor.r = minutestate;
    		skycolor.g = minutestate;
    		skycolor.b = minutestate;
    	}
    	else
    	{
    		skycolor.r = 1.0f - minutestate;
    		skycolor.g = 1.0f - minutestate;
    		skycolor.b = 1.0f - minutestate;
    	}
    }
    
    bool FileExists(char * name)
    {
    	if (CreateFile(name, 0, 0, 0, OPEN_EXISTING, 0, 0) == INVALID_HANDLE_VALUE)
    	{
    		return false;
    	}
    
    	return true;
    }
    
    void GetCamCoords(double* x_cam, double* y_cam, double* z_cam)
    {
    	double m[16];
    
    	glGetDoublev(GL_MODELVIEW_MATRIX, m);
    	*x_cam = -m[12] * m[0] - m[13] * m[1] - m[14] * m[2];
    	*y_cam = -m[12] * m[4] - m[13] * m[5] - m[14] * m[6];
    	*z_cam = -m[12] * m[8] - m[13] * m[9] - m[14] * m[10];
    }
    
    void CALLBACK SkyTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
    {
    	ChangeSky();
    }
    
    void InitDisplay()
    {
    	SetTimer(FindWindow(__CustomTitle, NULL), 3, 60000, (TIMERPROC)int(Config.SystemSkyBox));
    	{
    		char texturepath[256];
    		sprintf_s(texturepath, "%s", ".\\Data\\Custom\\Sky\\Null.bmp");
    
    		if (!FileExists(texturepath))
    		{
    			MessageBox(0, "can't find Sky\Null.bmp", "Erro SkyBox", MB_OK | MB_ICONERROR);
    			ExitProcess(0);
    		}
    
    		AUX_RGBImageRec* images[32][6];
    		AUX_RGBImageRec* blankimage = auxDIBImageLoad(texturepath);
    
    		try
    		{
    			for (int i = 0; i < 30; i++)
    			{
    				for (int j = 0; j < 6; j++)
    				{
    					images[i][j] = blankimage;
    				}
    
    				sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Back.bmp", i + 1);
    
    				if (FileExists(texturepath))
    				{
    					images[i][0] = auxDIBImageLoad(texturepath);
    				}
    
    				sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Bottom.bmp", i + 1);
    
    				if (FileExists(texturepath))
    				{
    					images[i][1] = auxDIBImageLoad(texturepath);
    				}
    
    				sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Front.bmp", i + 1);
    
    				if (FileExists(texturepath))
    				{
    					images[i][2] = auxDIBImageLoad(texturepath);
    				}
    
    				sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Left.bmp", i + 1);
    
    				if (FileExists(texturepath))
    				{
    					images[i][3] = auxDIBImageLoad(texturepath);
    				}
    
    				sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Right.bmp", i + 1);
    
    				if (FileExists(texturepath))
    				{
    					images[i][4] = auxDIBImageLoad(texturepath);
    				}
    
    				sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Top.bmp", i + 1);
    
    				if (FileExists(texturepath))
    				{
    					images[i][5] = auxDIBImageLoad(texturepath);
    				}
    			}
    		}
    		catch (...)
    		{
    			/* NOPE */
    		}
    
    		for (int i = 0; i < 30; i++)
    		{
    			for (int j = 0; j < 6; j++)
    			{
    				glGenTextures(1, &textures[i][j]);
    				glBindTexture(GL_TEXTURE_2D, textures[i][j]);
    				glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    				glTexImage2D(GL_TEXTURE_2D, 0, 3, images[i][j]->sizeX, images[i][j]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, images[i][j]->data);
    				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    			}
    		}
    
    		skycolor.r = 1.0f;
    		skycolor.g = 1.0f;
    		skycolor.b = 1.0f;
    
    		if (Config.SystemDayNight)
    		{
    			SetTimer(FindWindow(__CustomTitle, NULL), 2, 5000, (TIMERPROC)SkyTimerProc);
    
    			ChangeSky();
    		}
    	}
    
    	DisplayInitialized = true;
    }
    
    bool CanDrawSky()
    {
    	char texturepath[64];
    	sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Top.bmp", *Map + 1);
    
    	if (FileExists(texturepath))
    	{
    		return true;
    	}
    
    	return false;
    }
    
    void Display()
    {
    	SkyHook();
    
    	*MainState = 5;
    
    	if (*MainState == 5)
    	{
    		if (!DisplayInitialized)
    		{
    			InitDisplay();
    		}
    
    		if (Config.SystemSkyBox && CanDrawSky())
    		{
    			double x_cam, y_cam, z_cam;
    			GetCamCoords(&x_cam, &y_cam, &z_cam);
    
    			Blend(1);
    			glColor3d(skycolor.r, skycolor.g, skycolor.b);
    
    			glBindTexture(GL_TEXTURE_2D, textures[*Map][5]);
    			glBegin(GL_QUADS);
    
    			//TOP
    			glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 1500);
    			glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 1500);
    			glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 1500);
    			glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 1500);
    			glEnd();
    
    			glBindTexture(GL_TEXTURE_2D, textures[*Map][1]);
    			glBegin(GL_QUADS);
    
    			//BOTTOM
    			glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 0);
    			glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 0);
    			glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 0);
    			glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 0);
    			glEnd();
    
    			glBindTexture(GL_TEXTURE_2D, textures[*Map][2]);
    			glBegin(GL_QUADS);
    
    			//FRONT
    			glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 1500);
    			glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 1500);
    			glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 0);
    			glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 0);
    			glEnd();
    
    			glBindTexture(GL_TEXTURE_2D, textures[*Map][0]);
    			glBegin(GL_QUADS);
    
    			//BACK
    			glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 1500);
    			glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 1500);
    			glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 0);
    			glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 0);
    			glEnd();
    
    			glBindTexture(GL_TEXTURE_2D, textures[*Map][3]);
    			glBegin(GL_QUADS);
    
    			//LEFT
    			glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 1500);
    			glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 1500);
    			glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 0);
    			glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 0);
    			glEnd();
    
    			glBindTexture(GL_TEXTURE_2D, textures[*Map][4]);
    			glBegin(GL_QUADS);
    
    			//RIGHT
    			glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 1500);
    			glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 1500);
    			glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 0);
    			glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 0);
    			glEnd();
    
    			UnBlend();
    		}
    	}
    }
    
    void HookSky()
    {
    	DisplayInitialized = false;
    	ToolKit.HookOffset((DWORD)&Display, 0x4D9AB7, 0xE8); //1.03k
    }
    .h
    Code:
    #ifndef _SkyBox_H
    #define _SkyBox_H
    
    #include "StdAfx.h"
    
    #include <gl\gl.h>
    #include <gl\glu.h>
    #include <tlhelp32.h>
    
    #pragma comment(lib,"OpenGL32.lib")
    #pragma comment(lib,"GLu32.lib")
    #pragma comment(lib,"GLaux.lib")
    #pragma comment(lib,"ADVAPI32.lib")
    #pragma comment(lib,"Gdi32.lib")
    #pragma comment(lib,"winmm.lib") 
    #pragma comment(lib,"User32.lib")
    
    void HookSky();
    
    #endif
    dllmain.cpp
    Code:
    HookSky();
    someone have offset mapcheck(fog) main 1.04D?

  6. #6
    Enthusiast Skaz is offline
    MemberRank
    Apr 2015 Join Date
    UALocation
    41Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by ikenylee View Post
    here source Sky

    .cpp
    Code:
    #include "StdAfx.h"
    #include "SkyBox.h"
    #include "ToolKit.h"
    #include "Config.h"
    struct FRGB
    {
        float r, g, b;
    };
    
    FRGB skycolor;
    
    unsigned int textures[32][6];
    
    bool DisplayInitialized;
    
    typedef int(*TSkyHook)();
    TSkyHook SkyHook = (TSkyHook)0x005B9260;        //1.03k
    
    typedef int(*TBlend) (int);
    TBlend Blend = (TBlend)0x00635FD0;        //1.03k
    
    typedef int(*TUnBlend) ();
    TUnBlend UnBlend = (TUnBlend)0x00635F50;        //1.03k
    
    int *MainState = (int*)0x00E609E8;            //1.03k
    int *Map = (int*)0x00E61E18;            //1.03k
    
    void ChangeSky()
    {
        SYSTEMTIME sm;
        GetLocalTime(&sm);
    
        int hourstate = sm.wHour % 2;
        float minutestate = (float)sm.wMinute / 60.0f;
    
        if (hourstate == 0)
        {
            skycolor.r = minutestate;
            skycolor.g = minutestate;
            skycolor.b = minutestate;
        }
        else
        {
            skycolor.r = 1.0f - minutestate;
            skycolor.g = 1.0f - minutestate;
            skycolor.b = 1.0f - minutestate;
        }
    }
    
    bool FileExists(char * name)
    {
        if (CreateFile(name, 0, 0, 0, OPEN_EXISTING, 0, 0) == INVALID_HANDLE_VALUE)
        {
            return false;
        }
    
        return true;
    }
    
    void GetCamCoords(double* x_cam, double* y_cam, double* z_cam)
    {
        double m[16];
    
        glGetDoublev(GL_MODELVIEW_MATRIX, m);
        *x_cam = -m[12] * m[0] - m[13] * m[1] - m[14] * m[2];
        *y_cam = -m[12] * m[4] - m[13] * m[5] - m[14] * m[6];
        *z_cam = -m[12] * m[8] - m[13] * m[9] - m[14] * m[10];
    }
    
    void CALLBACK SkyTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
    {
        ChangeSky();
    }
    
    void InitDisplay()
    {
        SetTimer(FindWindow(__CustomTitle, NULL), 3, 60000, (TIMERPROC)int(Config.SystemSkyBox));
        {
            char texturepath[256];
            sprintf_s(texturepath, "%s", ".\\Data\\Custom\\Sky\\Null.bmp");
    
            if (!FileExists(texturepath))
            {
                MessageBox(0, "can't find Sky\Null.bmp", "Erro SkyBox", MB_OK | MB_ICONERROR);
                ExitProcess(0);
            }
    
            AUX_RGBImageRec* images[32][6];
            AUX_RGBImageRec* blankimage = auxDIBImageLoad(texturepath);
    
            try
            {
                for (int i = 0; i < 30; i++)
                {
                    for (int j = 0; j < 6; j++)
                    {
                        images[i][j] = blankimage;
                    }
    
                    sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Back.bmp", i + 1);
    
                    if (FileExists(texturepath))
                    {
                        images[i][0] = auxDIBImageLoad(texturepath);
                    }
    
                    sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Bottom.bmp", i + 1);
    
                    if (FileExists(texturepath))
                    {
                        images[i][1] = auxDIBImageLoad(texturepath);
                    }
    
                    sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Front.bmp", i + 1);
    
                    if (FileExists(texturepath))
                    {
                        images[i][2] = auxDIBImageLoad(texturepath);
                    }
    
                    sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Left.bmp", i + 1);
    
                    if (FileExists(texturepath))
                    {
                        images[i][3] = auxDIBImageLoad(texturepath);
                    }
    
                    sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Right.bmp", i + 1);
    
                    if (FileExists(texturepath))
                    {
                        images[i][4] = auxDIBImageLoad(texturepath);
                    }
    
                    sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Top.bmp", i + 1);
    
                    if (FileExists(texturepath))
                    {
                        images[i][5] = auxDIBImageLoad(texturepath);
                    }
                }
            }
            catch (...)
            {
                /* NOPE */
            }
    
            for (int i = 0; i < 30; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    glGenTextures(1, &textures[i][j]);
                    glBindTexture(GL_TEXTURE_2D, textures[i][j]);
                    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
                    glTexImage2D(GL_TEXTURE_2D, 0, 3, images[i][j]->sizeX, images[i][j]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, images[i][j]->data);
                    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
                }
            }
    
            skycolor.r = 1.0f;
            skycolor.g = 1.0f;
            skycolor.b = 1.0f;
    
            if (Config.SystemDayNight)
            {
                SetTimer(FindWindow(__CustomTitle, NULL), 2, 5000, (TIMERPROC)SkyTimerProc);
    
                ChangeSky();
            }
        }
    
        DisplayInitialized = true;
    }
    
    bool CanDrawSky()
    {
        char texturepath[64];
        sprintf_s(texturepath, ".\\Data\\Custom\\Sky\\World%d\\Top.bmp", *Map + 1);
    
        if (FileExists(texturepath))
        {
            return true;
        }
    
        return false;
    }
    
    void Display()
    {
        SkyHook();
    
        *MainState = 5;
    
        if (*MainState == 5)
        {
            if (!DisplayInitialized)
            {
                InitDisplay();
            }
    
            if (Config.SystemSkyBox && CanDrawSky())
            {
                double x_cam, y_cam, z_cam;
                GetCamCoords(&x_cam, &y_cam, &z_cam);
    
                Blend(1);
                glColor3d(skycolor.r, skycolor.g, skycolor.b);
    
                glBindTexture(GL_TEXTURE_2D, textures[*Map][5]);
                glBegin(GL_QUADS);
    
                //TOP
                glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 1500);
                glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 1500);
                glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 1500);
                glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 1500);
                glEnd();
    
                glBindTexture(GL_TEXTURE_2D, textures[*Map][1]);
                glBegin(GL_QUADS);
    
                //BOTTOM
                glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 0);
                glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 0);
                glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 0);
                glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 0);
                glEnd();
    
                glBindTexture(GL_TEXTURE_2D, textures[*Map][2]);
                glBegin(GL_QUADS);
    
                //FRONT
                glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 1500);
                glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 1500);
                glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 0);
                glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 0);
                glEnd();
    
                glBindTexture(GL_TEXTURE_2D, textures[*Map][0]);
                glBegin(GL_QUADS);
    
                //BACK
                glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 1500);
                glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 1500);
                glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 0);
                glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 0);
                glEnd();
    
                glBindTexture(GL_TEXTURE_2D, textures[*Map][3]);
                glBegin(GL_QUADS);
    
                //LEFT
                glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 1500);
                glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 1500);
                glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam + 2300, 0);
                glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam - 2300, y_cam - 2300, 0);
                glEnd();
    
                glBindTexture(GL_TEXTURE_2D, textures[*Map][4]);
                glBegin(GL_QUADS);
    
                //RIGHT
                glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 1500);
                glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 1500);
                glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam + 2300, 0);
                glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam + 2300, y_cam - 2300, 0);
                glEnd();
    
                UnBlend();
            }
        }
    }
    
    void HookSky()
    {
        DisplayInitialized = false;
        ToolKit.HookOffset((DWORD)&Display, 0x4D9AB7, 0xE8); //1.03k
    }
    .h
    Code:
    #ifndef _SkyBox_H
    #define _SkyBox_H
    
    #include "StdAfx.h"
    
    #include <gl\gl.h>
    #include <gl\glu.h>
    #include <tlhelp32.h>
    
    #pragma comment(lib,"OpenGL32.lib")
    #pragma comment(lib,"GLu32.lib")
    #pragma comment(lib,"GLaux.lib")
    #pragma comment(lib,"ADVAPI32.lib")
    #pragma comment(lib,"Gdi32.lib")
    #pragma comment(lib,"winmm.lib") 
    #pragma comment(lib,"User32.lib")
    
    void HookSky();
    
    #endif
    dllmain.cpp
    Code:
    HookSky();
    someone have offset mapcheck(fog) main 1.04D?
    Need convert .ozj in .jpg and no crash .

  7. #7
    (づ。◕‿‿◕。) Natzugen is offline
    MemberRank
    Jun 2014 Join Date
    ElbelandLocation
    1,858Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by phgkhh View Post
    Hi mauro,

    It does not work for me, still have zMain.exe in the process after exit the game, and it takes 50mb of memory :( Adding the POP EBP also cause my main to crash, same as your. Here is my dllmain.cpp:

    Code:
    extern "C" __declspec(dllexport)void Init()
    {
        DWORD OldProtect;
        // ----
        if(VirtualProtect(LPVOID(0x401000),0x00D21FFF,PAGE_EXECUTE_READWRITE,&OldProtect))
        {
    #ifdef __NOVUS__
        gCraftSystem.Load();
    #endif
        #ifdef __RMOS__
        g_ItemRank.Load(); 
    #endif
        gConnectEx.Load();
        gController.Load();
        gChatExpanded.Load();
        gItemPrice.Load();
        gItem.Load();
        gResetSystem.Load();
        gProtocol.Load();
        gCheatGuard.Load();
        gObjUser.Load();
        gOther.Load();
        gInterface.Load();
        gVisualFix.InitVisualFix();
        g_ItemModel.Load();    
        gOffTrade.Init();
        gSocketItem.Load();
    
    // Custom added
        CustomBowsLoad();
        ItemGlowLoad();
        ItemEffectLoad();
        SetSmokeEffectLoad();
        gMiniMap.Load();
    
    // Loading .DLL
        LoadLibrary("ttlci.dll");    
        LoadLibrary("opengl32.dll");
        }
    }
    mine works fine adding the POP EBP here

    Code:
    void MapCheckerCore2(int Map)
    {
        if (IsValidMap(Map))
        {
            LoadMap(Map);
    
    
    
    
            _asm
            {
                CALL LoadMap1
                MOV ECX, EAX
                CALL LoadMap2
                MOV ECX, EAX
                CALL LoadMap3
            }
        }
    
    
    
    
        _asm
        {
            PUSH Map
            CALL LoadMap4 // -> Here on: 1.04d main.exe is not necesary POP EBP instruction.. I don't know why ^^ I like think that is by call convention type (__cdecl or __stdcall on original main function).
            POP EBP //here is the pop ebp
        }
    }
    here is the main im using just in case https://mega.nz/#!0IcR0KAS!I_Ozt3-q_...D9K8C9uuHxx-ss
    @mauro07 is there a reason why you are using the glow.dll instead of the ItemModel.z ?

  8. #8
    Darkness Member Kiosani is offline
    MemberRank
    Oct 2007 Join Date
    ArgentinaLocation
    1,276Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by natzugen View Post
    mine works fine adding the POP EBP here

    Code:
    void MapCheckerCore2(int Map)
    {
        if (IsValidMap(Map))
        {
            LoadMap(Map);
    
    
    
    
            _asm
            {
                CALL LoadMap1
                MOV ECX, EAX
                CALL LoadMap2
                MOV ECX, EAX
                CALL LoadMap3
            }
        }
    
    
    
    
        _asm
        {
            PUSH Map
            CALL LoadMap4 // -> Here on: 1.04d main.exe is not necesary POP EBP instruction.. I don't know why ^^ I like think that is by call convention type (__cdecl or __stdcall on original main function).
            POP EBP //here is the pop ebp
        }
    }
    here is the main im using just in case https://mega.nz/#!0IcR0KAS!I_Ozt3-q_...D9K8C9uuHxx-ss
    @mauro07 is there a reason why you are using the glow.dll instead of the ItemModel.z ?
    no.. I am using.. and I don't know for that.. xD I mean, is the same, but now I'm using.. my glow function :D is better using: vec3_t

  9. #9
    Darkness Member Kiosani is offline
    MemberRank
    Oct 2007 Join Date
    ArgentinaLocation
    1,276Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    I already fixed this problem with MiniMap on 1.04d (that not close process & crash).. I'm searching for a specific source code.. to make a exchange.. I like change main font.. I mean.. by: Tahoma or anothers types.. and with size change from font, option too.. all from a external: .ini file.. I know that some persons here have this source.. send me PM.

  10. #10
    ^_^ ashlay is offline
    MemberRank
    Jun 2010 Join Date
    BrazilLocation
    874Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO


  11. #11
    Darkness Member Kiosani is offline
    MemberRank
    Oct 2007 Join Date
    ArgentinaLocation
    1,276Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by ashlay View Post


    Last edited by Kiosani; 22-02-16 at 06:49 PM.

  12. #12
    Retired NanoGuy is offline
    MemberRank
    Jul 2012 Join Date
    IsraelLocation
    286Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by mauro07 View Post
    I already fixed this problem with MiniMap on 1.04d (that not close process & crash).. I'm searching for a specific source code.. to make a exchange.. I like change main font.. I mean.. by: Tahoma or anothers types.. and with size change from font, option too.. all from a external: .ini file.. I know that some persons here have this source.. send me PM.
    1. hook createfonta
    2. redirect it
    3. directly write
    choose your path!

  13. #13
    Darkness Member Kiosani is offline
    MemberRank
    Oct 2007 Join Date
    ArgentinaLocation
    1,276Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by NanoGuy View Post
    1. hook createfonta
    2. redirect it
    3. directly write
    choose your path!
    Something like this ?

    Code:
    #include "StdAfx.h"
    #include "Font.h"
    #include "Utils.h"
    #include "TMemory.h"
    
    
    Font gFont;
    
    
    void Font::Load()
    {
        SetDword((PVOID)(Offset_CreateFontA1 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA1 + 5));
        SetDword((PVOID)(Offset_CreateFontA2 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA2 + 5));
        SetDword((PVOID)(Offset_CreateFontA3 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA3 + 5));
        SetDword((PVOID)(Offset_CreateFontA4 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA4 + 5));
        SetDword((PVOID)(Offset_CreateFontA5 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA5 + 5));
    
    
        SetByte((PVOID)Offset_CreateFontA1, ASM::CALL);
        SetByte((PVOID)Offset_CreateFontA2, ASM::CALL);
        SetByte((PVOID)Offset_CreateFontA3, ASM::CALL);
        SetByte((PVOID)Offset_CreateFontA4, ASM::CALL);
        SetByte((PVOID)Offset_CreateFontA5, ASM::CALL);
    
    
        SetByte((PVOID)(Offset_CreateFontA1 + 5), ASM::NOP);
        SetByte((PVOID)(Offset_CreateFontA2 + 5), ASM::NOP);
        SetByte((PVOID)(Offset_CreateFontA3 + 5), ASM::NOP);
        SetByte((PVOID)(Offset_CreateFontA4 + 5), ASM::NOP);
        SetByte((PVOID)(Offset_CreateFontA5 + 5), ASM::NOP);
    }
    
    
    HFONT LoadNewFont()
    {
        char MyFontFaceName[100];
        HFONT MyFont;
    
    
        int Bold        = GetPrivateProfileIntA("Font","Bold",0,".\\Core.ini");
        int Height        = GetPrivateProfileIntA("Font","Size",0,".\\Core.ini");
        int Italic        = GetPrivateProfileIntA("Font","Italic",0,".\\Core.ini");
        int Unicode        = GetPrivateProfileIntA("Font","Unicode",0,".\\Core.ini");
    
    
        int Quality        = 3;
        int UnderLine    = 0;
        int Width        = 0;
        int StrikeOut    = 0;
    
    
        GetPrivateProfileStringA("Font","FontName","Arial",MyFontFaceName,100,".\\Core.ini");
    
    
        if (Bold == 0)
        {
            if (Unicode == 1)
            {
                MyFont = CreateFontA(Height, Width, 0, 0, 400, Italic, UnderLine, StrikeOut, 0x01, 0, 0, Quality, 0, MyFontFaceName);
            }
            else
            {
                MyFont = CreateFontA(Height, Width, 0, 0, 400, Italic, UnderLine, StrikeOut, 0x0, 0, 0, Quality, 0, MyFontFaceName);
            }
        }
        else
        {
            if (Unicode == 1)
            {
                MyFont = CreateFontA(Height, Width, 0, 0, 700, Italic, UnderLine, StrikeOut, 0x01, 0, 0, Quality, 0, MyFontFaceName);
            }
            else
            {
                MyFont = CreateFontA(Height, Width, 0, 0, 700, Italic, UnderLine, StrikeOut, 0x0, 0, 0, Quality, 0, MyFontFaceName);
            }
        }
        return MyFont;
    }
    PS: Don't work... at least no on: 1.03k JPN main.exe

  14. #14
    Retired NanoGuy is offline
    MemberRank
    Jul 2012 Join Date
    IsraelLocation
    286Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    Quote Originally Posted by mauro07 View Post
    Something like this ?

    Code:
    #include "StdAfx.h"
    #include "Font.h"
    #include "Utils.h"
    #include "TMemory.h"
    
    
    Font gFont;
    
    
    void Font::Load()
    {
        SetDword((PVOID)(Offset_CreateFontA1 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA1 + 5));
        SetDword((PVOID)(Offset_CreateFontA2 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA2 + 5));
        SetDword((PVOID)(Offset_CreateFontA3 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA3 + 5));
        SetDword((PVOID)(Offset_CreateFontA4 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA4 + 5));
        SetDword((PVOID)(Offset_CreateFontA5 + 1), (DWORD)&LoadNewFont - (Offset_CreateFontA5 + 5));
    
    
        SetByte((PVOID)Offset_CreateFontA1, ASM::CALL);
        SetByte((PVOID)Offset_CreateFontA2, ASM::CALL);
        SetByte((PVOID)Offset_CreateFontA3, ASM::CALL);
        SetByte((PVOID)Offset_CreateFontA4, ASM::CALL);
        SetByte((PVOID)Offset_CreateFontA5, ASM::CALL);
    
    
        SetByte((PVOID)(Offset_CreateFontA1 + 5), ASM::NOP);
        SetByte((PVOID)(Offset_CreateFontA2 + 5), ASM::NOP);
        SetByte((PVOID)(Offset_CreateFontA3 + 5), ASM::NOP);
        SetByte((PVOID)(Offset_CreateFontA4 + 5), ASM::NOP);
        SetByte((PVOID)(Offset_CreateFontA5 + 5), ASM::NOP);
    }
    
    
    HFONT LoadNewFont()
    {
        char MyFontFaceName[100];
        HFONT MyFont;
    
    
        int Bold        = GetPrivateProfileIntA("Font","Bold",0,".\\Core.ini");
        int Height        = GetPrivateProfileIntA("Font","Size",0,".\\Core.ini");
        int Italic        = GetPrivateProfileIntA("Font","Italic",0,".\\Core.ini");
        int Unicode        = GetPrivateProfileIntA("Font","Unicode",0,".\\Core.ini");
    
    
        int Quality        = 3;
        int UnderLine    = 0;
        int Width        = 0;
        int StrikeOut    = 0;
    
    
        GetPrivateProfileStringA("Font","FontName","Arial",MyFontFaceName,100,".\\Core.ini");
    
    
        if (Bold == 0)
        {
            if (Unicode == 1)
            {
                MyFont = CreateFontA(Height, Width, 0, 0, 400, Italic, UnderLine, StrikeOut, 0x01, 0, 0, Quality, 0, MyFontFaceName);
            }
            else
            {
                MyFont = CreateFontA(Height, Width, 0, 0, 400, Italic, UnderLine, StrikeOut, 0x0, 0, 0, Quality, 0, MyFontFaceName);
            }
        }
        else
        {
            if (Unicode == 1)
            {
                MyFont = CreateFontA(Height, Width, 0, 0, 700, Italic, UnderLine, StrikeOut, 0x01, 0, 0, Quality, 0, MyFontFaceName);
            }
            else
            {
                MyFont = CreateFontA(Height, Width, 0, 0, 700, Italic, UnderLine, StrikeOut, 0x0, 0, 0, Quality, 0, MyFontFaceName);
            }
        }
        return MyFont;
    }
    PS: Don't work... at least no on: 1.03k JPN main.exe
    looks fine check address of hooks and if you hooked them all

  15. #15
    Newbie :) Pinkof is offline
    MemberRank
    Mar 2008 Join Date
    760Posts

    re: [Development] MiniMap Source Code (2016) to: 1.04.04 GMO

    you can test it. to change font. just need put the name of font that you want use.




Page 1 of 2 12 LastLast

Advertisement