Jump to content

masodikbela

Premium
  • Posts

    235
  • Joined

  • Last visited

  • Days Won

    28
  • Feedback

    100%

Posts posted by masodikbela

  1. 9 hours ago, Shang said:

    There is a bug with scaled images, look at this gif:

    01f346e1a1.gif

    Does the window have "float" flag anywhere? Because it looks like the same when you add "float" to a window. Also as far as I remember it should work with scaled windows...

  2. On 2017. 03. 13. at 10:20 AM, xP3NG3Rx said:

    First of all you need to know:

    1. I don't help to install it. Don't even take the contact with me about it.
    2. The whole code is written by me, and reversed from official binaries.
    3. At the beginning do a backup for your files(srcs+pys) and READ CAREFULLY the readme.
    4. W/o brain.exe please close this tab, or your browser, thank you for your understanding.

     

    • Love 6
  3. M2 Download Center

    This is the hidden content, please
    ( Internal )

    Hi there devs,

     

    Probably the most of us know the problem when an image contains alpha/fully transparent parts but you can't click trough them and it would be very necessary to do so. This problem is very common with the taskbars, for example with the ilumina taskbar (you know when it looks like you are clicking the ground, but the image is still there but that part is transparent).

    Video:

    How to:

    EterPythonLib\PythonWindow.h
     
    Spoiler

    After this:

    
    
    				FLAG_RTL				= (1 << 11),	// Right-to-left

    Add this:

    
    
    				FLAG_ALPHA_SENSITIVE	= (1 << 12),	// flag for activating alpha sensitive

    Then above this:

    
    
    		public:
    			CWindow(PyObject * ppyObject);
    			virtual ~CWindow();

    Add this:

    
    
    			enum WindowTypes // window type flags to recognize expanded_image class
    			{
    				WINDOW_TYPE_WINDOW,
    				WINDOW_TYPE_EX_IMAGE,
    
    				WINDOW_TYPE_MAX_NUM
    			};

    Under this:

    
    
    			int				GetChildCount()	{ return m_pChildList.size(); }

    Add this:

    
    
    			void			IsTransparentOnPixel(long* x, long* y, bool* ret);

    Under this:

    
    
    			TWindowContainer	m_pReserveChildList;

    Add this:

    
    
    			BYTE				m_windowType; // to recognize window type

    In the class CExpandedImageBox : public CImageBox class after this:

    
    
    			void SetRenderingMode(int iMode);

    Add this:

    
    
    			D3DXCOLOR GetPixelColor(int x, int y) { if (m_pImageInstance) return m_pImageInstance->GetPixelColor(x, y); else return D3DXCOLOR(0, 0, 0, 0); }

     

    EterPythonLib\PythonWindowManagerModule.cpp
    Spoiler

    After this:

    
    
    		else if (!stricmp(pszFlag, "ltr"))
    			pWin->RemoveFlag(UI::CWindow::FLAG_RTL);

    Add this:

    
    
    		else if (!stricmp(pszFlag, "alpha_sensitive"))
    			pWin->AddFlag(UI::CWindow::FLAG_ALPHA_SENSITIVE);

     

    EterPythonLib\PythonWindow.cpp

    Spoiler

    In function CWindow::CWindow(PyObject * ppyObject) after this:

    
    
    		m_limitBiasRect.bottom = m_limitBiasRect.left = m_limitBiasRect.right = m_limitBiasRect.top = 0;

    Add this:

    
    
    		m_windowType = WINDOW_TYPE_WINDOW; // setting all window type to window first

    In function CWindow * CWindow::PickWindow(long x, long y) after this:

    
    
    		if (IsFlag(CWindow::FLAG_NOT_PICK))
    			return NULL;

    Add this:

    
    
    		if (IsFlag(CWindow::FLAG_ALPHA_SENSITIVE)) // check flag
    		{
    			bool isFullTransparent = true;
    			IsTransparentOnPixel(&x, &y, &isFullTransparent); // check transparency of the clicking position
    			if (isFullTransparent)
    				return NULL; // if transparent then return nothing, else give current window
    		}

    Then above this:

    
    
    	CWindow * CWindow::PickTopWindow(long x, long y)
    	{

    Add this:

    
    
    	void CWindow::IsTransparentOnPixel(long* x, long* y, bool* ret)
    	{
    		if (IsShow() && IsIn(*x, *y)) // check if the window is active and the cursor is in the window
    		{
    			if (m_windowType == WINDOW_TYPE_EX_IMAGE) // check if its an expanded_image
    			{
    				D3DXCOLOR pixel = ((CExpandedImageBox*)this)->GetPixelColor(*x - m_rect.left, *y - m_rect.top); // get current pixel color
    
    				if ((BYTE)pixel.a != 0) // if the pixel is not trasparent then the whole window is not trasparent
    				{
    					*ret = false;
    					return;
    				}
    			}
    			else if (m_pChildList.empty()) // if its not ex_image and has no child then its NOT transparent [default for other components]
    			{
    				*ret = false;
    				return;
    			}
    		}
    		if (!m_pChildList.empty()) // check if all the childs are trasparent on the current position
    		{
    			std::list<CWindow *>::reverse_iterator ritor = m_pChildList.rbegin();
    			for (; ritor != m_pChildList.rend(); ritor++)
    			{
    				(*ritor)->IsTransparentOnPixel(x, y, ret);
    				if (!*ret)
    					return;
    			}
    		}
    	}

    In the CWindow * CWindow::PickTopWindow(long x, long y) function replace this:

    
    
    						return pWin;

    With this:

    
    
    					{
    						if (pWin->IsFlag(CWindow::FLAG_ALPHA_SENSITIVE)) // if the window is alpha sensitive check the alpha
    						{
    							bool isFullTransparent = true;
    							pWin->IsTransparentOnPixel(&x, &y, &isFullTransparent);
    							if (isFullTransparent) // if the window is transparent at the coordinates then its not the top window
    								continue;
    						}
    						return pWin;
    					}

    Then replace this:

    
    
    	CExpandedImageBox::CExpandedImageBox(PyObject * ppyObject) : CImageBox(ppyObject)
    	{
    	}

    With this:

    
    
    	CExpandedImageBox::CExpandedImageBox(PyObject * ppyObject) : CImageBox(ppyObject)
    	{
    		m_windowType = WINDOW_TYPE_EX_IMAGE;
    	}

     

    EterLib\GrpImageTexture.cpp

    Spoiler

    In the function bool CGraphicImageTexture::CreateFromMemoryFile(UINT bufSize, const void * c_pvBuf, D3DFORMAT d3dFmt, DWORD dwFilter) replace this:

    
    
    		if (FAILED(D3DXCreateTextureFromFileInMemoryEx(
    					ms_lpd3dDevice,
    					c_pvBuf,
    					bufSize,
    					D3DX_DEFAULT,
    					D3DX_DEFAULT,
    					D3DX_DEFAULT,
    					0,
    					d3dFmt,
    					D3DPOOL_MANAGED,
    					dwFilter,
    					dwFilter,
    					0xffff00ff,
    					&imageInfo,
    					NULL,
    					&m_lpd3dTexture)))
    		{
    			TraceError("CreateFromMemoryFile: Cannot create texture");
    			return false;
    		}

    With this:

    
    
    		if (FAILED(D3DXGetImageInfoFromFileInMemory(c_pvBuf, bufSize, &imageInfo))) //first get the imageinfo (reason: sizes needed)
    		{
    			TraceError("CreateFromMemoryFile: Cannot GetImageInfo from texture");
    			return false;
    		}
    		if (FAILED(D3DXCreateTextureFromFileInMemoryEx(
    					ms_lpd3dDevice,
    					c_pvBuf,
    					bufSize,
    					imageInfo.Width, // using the correct filesizes here will result that the maximum mipmap size will be the file's original size: its necessary for the alpha sensitive,
    					imageInfo.Height, // cous otherwise it reads wrong picture colors since the image will be resized in the result of mipmap generation
    					D3DX_DEFAULT,     // also it will improve the quality of the images with a little
    					0,
    					d3dFmt,
    					D3DPOOL_MANAGED,
    					dwFilter,
    					dwFilter,
    					0xffff00ff,
    					NULL, //we already have our image info, doesn't need to get it again
    					NULL,
    					&m_lpd3dTexture)))
    		{
    			TraceError("CreateFromMemoryFile: Cannot create texture");
    			return false;
    		}

     

    EterLib\GrpImageInstance.h

    Spoiler

    After this:

    
    
    		bool operator == (const CGraphicImageInstance & rhs) const;

    Add this:

    
    
    		D3DXCOLOR GetPixelColor(int x, int y);

     

    EterLib\GrpImageInstance.cpp

    Spoiler

    Add this to the end of the file:

    
    
    D3DXCOLOR CGraphicImageInstance::GetPixelColor(int x, int y)
    {
    	// we first need the d3d texture, but its the "shortest" way to get it
    	D3DXCOLOR dxClr = D3DXCOLOR(0, 0, 0, 0);
    	CGraphicImage * pImage = m_roImage.GetPointer();
    	if (!pImage)
    		return dxClr;
    	CGraphicTexture * pTexture = pImage->GetTexturePointer();
    	if (!pTexture)
    		return dxClr;
    
    	LPDIRECT3DTEXTURE8 d3dTexture = pTexture->GetD3DTexture();
    	if (!d3dTexture)
    		return dxClr;
    
    	IDirect3DSurface8* surface;
    	D3DSURFACE_DESC desc;
    	D3DLOCKED_RECT rect;
    	RECT rc;
    
    	// we want just want to lock only one pixel
    	rc.left = x;
    	rc.right = x + 1;
    	rc.top = y;
    	rc.bottom = y + 1;
    
    	if (FAILED(d3dTexture->GetSurfaceLevel(0, &surface))) // get the top surface of the image (it contains the whole image)
    		return dxClr;
    	if (FAILED(surface->GetDesc(&desc)))
    		return dxClr;
    	if (FAILED(surface->LockRect(&rect, &rc, D3DLOCK_READONLY | D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK))) // lock the pixel
    		return dxClr;
    
    	PBYTE dwTexel = (PBYTE)rect.pBits;
    
    	switch (desc.Format)
    	{
    	// there are several possible image formats, but its the most common one and as I saw its more than enough
    	case D3DFMT_A8R8G8B8:
    		dxClr.a = dwTexel[3];
    		dxClr.r = dwTexel[2];
    		dxClr.g = dwTexel[1];
    		dxClr.b = dwTexel[0];
    		break;
    	}
    	surface->UnlockRect(); // unlock the pixel for further using (like render)
    
    	return dxClr;
    }

     

    By default it won't check the alpha value, so it means that you have to add manually the "alpha_sensitive" flag to the preferred windows/objects (also note that its only effective with an expandedImageBox object and it has some interference with the "float" flag (if both added to the same object)). For the usage check the video. If you have any question, remark, or anything that you like to ask or suggest, feel free to post it here, or send it in PM.

    Have a nice day,
    ~masodikbela

    • Metin2 Dev 16
    • Think 1
    • Good 2
    • Love 1
    • Love 30
  4. Hi there devs,

    A few months ago I've made a solution for the well-known problems with the character select/logging out which is:

    • once you are about to change character, the stats (ht, st, playtime, etc...) and parts (armor/head) don't update properly: you have to do it twice to see the correct values/items
    • when a character is logging out from the game near to your character you can see a fast equipment change (the character is unequipping everything from him/herself)

    Explanation for the problems

    Spoiler

     

    When you perform a login or enter the game the client receives the necessary information for the charselect about your characters. The server sends this packet twice: once you log in into your account and when you select your character. After this the client will use this information in the future. So when you go back to the character select, you will see the old stats and parts. After that when you select your character again, the server sends the mentioned packet again, so when you do a second character change you will see the "updated" things.

    The reason for the second problem a little different. When a CHARACTER class is being deleted it also deletes the items from the character via the function RemoveFromCharacter. Here after the if (m_bEquipped) part you can see it calls the Unequip() function which will call SendUpdatePacket. Solving this problem possibly could give a little performance too in some cases since when lots of characters standing near to each other (for example in map1s) when someone do a logout the server have to "broadcast" lots of update packets to the characters, and their clients have to remove the parts from the affected character.

     

     

    The usual coding video

    The fix

    Spoiler

    server/char.cpp

    Spoiler

    Add this to the void CHARACTER:: Disconnect(const char * c_pszReason) function: //this is for the playtime update

    
    
    
    
    		packet_point_change pack;
    		pack.header = HEADER_GC_CHARACTER_POINT_CHANGE;
    		pack.dwVID = m_vid;
    		pack.type = POINT_PLAYTIME;
    		pack.value = GetRealPoint(POINT_PLAYTIME) + (get_dword_time() - m_dwPlayStartTime) / 60000;
    		pack.amount = 0;
    		GetDesc()->Packet(&pack, sizeof(struct packet_point_change));

    Above this:

    
    
    
    
    GetDesc()->BindCharacter(NULL);

    In the function void CHARACTER::UpdatePacket() add this: //this will prevent the server to send update packets about a currently logging out character

    
    
    
    
    	if (IsPC() && (!GetDesc() || !GetDesc()->GetCharacter()))
    		return;

    After this:

    
    
    
    
    	if (GetSectree() == NULL) return;

     

    client/PythonNetworkStreamPhaseGameActor.cpp

    Spoiler

    Add this to the function CPythonNetworkStream::__RecvCharacterUpdatePacket(SNetworkUpdateActorData * pkNetUpdateActorData) //this will update the saved parts about your character when you change armor/hair

    
    
    
    
    		m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].wHairPart = pkNetUpdateActorData->m_dwHair;
    		m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].wMainPart = pkNetUpdateActorData->m_dwArmor;

    After this:

    
    
    
    
    		__RefreshInventoryWindow();

     

    client/PythonNetworkStreamPhaseLoading.cpp

    Spoiler

    In the function bool CPythonNetworkStream::__RecvPlayerPoints() replace this //this will update the saved stats of your character when the server sends them during the loading phase

    
    
    
    
    	for (DWORD i = 0; i < POINT_MAX_NUM; ++i)
    		CPythonPlayer::Instance().SetStatus(i, PointsPacket.points[i]);

    with this:

    
    
    
    
    	for (DWORD i = 0; i < POINT_MAX_NUM; ++i)
    	{
    		CPythonPlayer::Instance().SetStatus(i, PointsPacket.points[i]);
    		if (i == POINT_LEVEL)
    			m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byLevel = PointsPacket.points[i];
    		else if (i == POINT_ST)
    			m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byST = PointsPacket.points[i];
    		else if (i == POINT_HT)
    			m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byHT = PointsPacket.points[i];
    		else if (i == POINT_DX)
    			m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byDX = PointsPacket.points[i];
    		else if (i == POINT_IQ)
    			m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byIQ = PointsPacket.points[i];
    
    	}

     

    client/PythonNetworkStreamPhaseGame.cpp

    Spoiler

    In the function bool CPythonNetworkStream::RecvPointChange() replace this //this will update the saved stats of your character when they are about to change during game phase

    
    
    
    
    			case POINT_LEVEL:
    			case POINT_ST:
    			case POINT_DX:
    			case POINT_HT:
    			case POINT_IQ:
    				__RefreshStatus();
    				__RefreshSkillWindow();
    				break;

    With this:

    
    
    
    
    			case POINT_PLAYTIME:
    				m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].dwPlayMinutes = PointChange.value;
    				break;
    			case POINT_LEVEL:
    				m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byLevel = PointChange.value;
    				__RefreshStatus();
    				__RefreshSkillWindow();
    				break;
    			case POINT_ST:
    				m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byST = PointChange.value;
    				__RefreshStatus();
    				__RefreshSkillWindow();
    				break;
    			case POINT_DX:
    				m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byDX = PointChange.value;
    				__RefreshStatus();
    				__RefreshSkillWindow();
    				break;
    			case POINT_HT:
    				m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byHT = PointChange.value;
    				__RefreshStatus();
    				__RefreshSkillWindow();
    				break;
    			case POINT_IQ:
    				m_akSimplePlayerInfo[m_dwSelectedCharacterIndex].byIQ = PointChange.value;
    				__RefreshStatus();
    				__RefreshSkillWindow();
    				break;

     

     

    GL for the setup and if you have further question(s), remark(s), or anything that you want to ask or suggest, feel free to post it here, or send it in PM.

    If you get error(s) please upload the affected (and edited) file(s) to http://pastebin.com/ and link it in your post, to make my work easier and probably I will be able to help you only in one post, so please spare me from asking basic requests like "Could you upload...". Thank you ;)

    Have a nice day,
    ~masodikbela

    • Metin2 Dev 7
    • Love 33
  5. The short answer:

    Spoiler

    4dc13fd52f691020a1308c5b6cbc6f49.svg

    The long answer:

    Spoiler

    You can't decompile an executable file. Okay, there are some methods or programs for generating C code from the assembly code, but it will be hard to read and impracticable. In short: you can't get back the original code from the executable.

     

    • Metin2 Dev 1
    • Love 4
  6. I found a crash issue (not in your release, but it affects all eterPackMakers, so it maybe affects yours too). When a file's path longer than ~64, it crashes. The problem is that a buffer is too small for this length. In the eterPack\Inline.h u should change the char dir[64(maybe? I don't remember the original number)]; to (for example) char dir[256]; (If u already fixed this problem then just ignore this post)

  7. Seems good, but if you accept a suggestion, I have one idea: I don't know if you used the ymir-made eterPack and eterBase projects, but if you did, then you should build a dll for the eterPack project, (instead of using it as lib) so anyone will be able to build their own dll and they will be able to use their own cipher/method.

    • Love 2
  8. Just now, Cyber36 said:

    Okay thank you very much :)

    Good explanation and tutorial! Only one question more: The operation system you use wasn't freebsd and the compiler not gcc or?

    How did you copied the .exe to a path and the server started with that, don't you need an ftp for a server?

    I'm using vc120 (visual studio 2013) on my windows 10 operation system. I compiled the server on windows so I can use it as an application (.exe).

  9. 2 minutes ago, Cyber36 said:

    Is it unnessecary where i add that function in interfacemodule.py?

    Cause i don't have that function: 

    
    def RemoveQuestDialog(self, key):

    You can add that thing anywhere in the file, the important thing is to stay in the current class (class Interface(object):).

  10. 39 minutes ago, TheMt2 said:

    Hey

    Thx for share.

    I have other problem, when /reload q, quest crash...

    Exemple: If player lvl 250 login, item of creat character is gived..

    I don't really understand, could you make a video or something about the crash?

  11. Hi there devs,

    About a few days ago one of my friends asked me if I could make a fix for the reload q problem. Maybe now some of you are saying "lol what the hell is he talking about, my reload q works perfectly..." and rightfully, because basically it works, it does its job on a test server with no players. But if you try to do a 'reload q' on a real server with players it has a high chance that it will crash the core. You can ask me again "why the hell do you want to reload the quest on a real server instead of fully rebooting the server?" and my answer is a question too: "why not?" Its more faster to add new quests and repair already installed ones, IF this function works well.

    Explanation of the crash

    Spoiler

    As usually I captured the "method of the problem solving". Also at the beginning of the video you can see the crash, and at the end how it will looks like when you set-up the fix.

    Okay, but why does it crash???

    As you can see in the video, the crash appears when a player open a quest that has a button, and if you do a reload q while its player didn't close that quest window, and after the reload finished he clicks on that button.
    The game's "quest system" uses a "suspend and resume" method. What do I mean by this? Once the processing of a quest reaches a line that contains a function that wants something from the player, (wait(), input(), select(), etc) it suspends the quest, then saves its state to a variable. After the player "answered", it will resume the quest, so it will continue from that line it stopped.

    And here comes the problem. What does a reload q exactly do? It removes all the quests from the memory and then reload them. So if a player click on a quest button after the reload, the server will try to load the suspended quest's state from the mentioned variable, but its a pointer, so it only contains a memory position where the real data is, and because we did a reload, this position no loner exists, but the game don't know it because it only sees that the variable has a value so it will just do its job. Once the processing reaches a point where it really wants to use that "quest state" data it will crash.

    So the solution is: clear all this variables for all the players.

    The fix of the crash

    Spoiler

    src/game

    questmanager.h:
    Under this:

    
    PC * GetPCForce(unsigned int pc);
    
    Insert this: 
    
    void		StopAllRunningQuests();
    
    questmanager.cpp:
    

    Under this:

    
    	void CQuestManager::DisconnectPC(LPCHARACTER ch)
    	{
    		m_mapPC.erase(ch->GetPlayerID());
    	}

    Insert this:

    
    	void CQuestManager::StopAllRunningQuests()
    	{
    		for (PCMap::iterator it = m_mapPC.begin(); it != m_mapPC.end(); it++)
    		{
    			it->second.CancelRunning();
    			LPCHARACTER pkChr = CHARACTER_MANAGER::instance().FindByPID(it->first);
    			if (!pkChr || !(pkChr->GetDesc()))
    				continue;
    			struct ::packet_script packet_script;
    
    			packet_script.header = HEADER_GC_SCRIPT;
    			packet_script.skin = QUEST_SKIN_NOWINDOW;
    			string data = "[DESTROY_ALL]";
    			packet_script.src_size = data.size();
    			packet_script.size = packet_script.src_size + sizeof(struct packet_script);
    
    			TEMP_BUFFER buf;
    			buf.write(&packet_script, sizeof(struct packet_script));
    			buf.write(&data[0], data.size());
    
    			pkChr->GetDesc()->Packet(buf.read_peek(), buf.size());
    		}
    	}

    Still in this file under this:

    
    	void CQuestManager::Reload()
    	{

    Insert this:

    
    StopAllRunningQuests();

    binary

    PythonNetworkStream.h:

    Under this:

    
    void OnScriptEventStart(int iSkin, int iIndex);

    Insert this:

    
    void HideQuestWindows();

    PythonNetworkStream.cpp:

    Insert this to the end of the file:

    
    void CPythonNetworkStream::HideQuestWindows()
    {
    	PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "HideAllQuestWindow", Py_BuildValue("()"));
    }

    PythonNetworkStreamPhaseGame.cpp:

    In the bool CPythonNetworkStream::RecvScriptPacket() function after this:

    
    str[str.size()-1] = '\0';

    Insert this:

    
    	if (str.compare(0, 13, "[DESTROY_ALL]") == 0)
    	{
    		CPythonNetworkStream::Instance().HideQuestWindows();
    		return true;
    	}

    root files(client)

    interfacemodule.py:

    Before this function:

    
    def RemoveQuestDialog(self, key):

    Insert this:

    
    	def HideAllQuestWindow(self):
    		tempList = []
    		for i,v in self.wndQuestWindow.iteritems():
    			tempList.append(v)
    
    		for i in tempList:
    			i.OnCancel()

    game.py:

    Under this:

    
    def OpenQuestWindow(self, skin, idx):
    		self.interface.OpenQuestWindow(skin, idx)

    Insert this:

    
    	def HideAllQuestWindow(self):
    		self.interface.HideAllQuestWindow()

    And we are done :)

    And finally let me wish you all good luck for the setup ;) If you have further question(s), remark(s), or anything that you want to ask or suggest, feel free to post it here, or send it in PM.

    If you get error(s) please upload the affected (and edited) file to http://pastebin.com/ and link it in your post, to make my work easier and probably I will be able to help you only in one post, so please spare me from asking basic requests like "Could you upload...". Thank you ;)

    Have a nice day,
    ~masodikbela

     

    • Metin2 Dev 1
    • Confused 1
    • Good 2
    • Love 17
  12. 1 hour ago, CDG said:

    My VM say that : https://metin2.download/picture/zt17Sq4XdDISwZ90OXJ5l02OJ6vHB9e3/.png

     

    But : https://metin2.download/picture/cfJFX093R27h3eSn73ahrsyoJR526cB6/.png

     

    The folder accids it empty, maybe its for that can someone send me his accids folder in the server part

     

    The path is still not correct... your folder is here: https://metin2.download/picture/j5rx8ok4BCB4S03X68ez4S4x4nzm4vlz/.png

    but the server wants to reach it here: https://metin2.download/picture/93EjGMrlTZKQ6xN0eAUQ6vWmHOeU0dDb/.png

  13. 10 hours ago, Ragirov43 said:

    :masodikbela  system problem

     

    lvl accepted ;)

    guild table accepted ;)

    group party accepted ;)

    no guild war Sending :(

    I checked this, and I found this in the guild_war.cpp:

        if (gw.type == GUILD_WAR_TYPE_FIELD)
            return;

    So if you tired to do a field war (type 0) then this could be the problem. Other wars are working perfectly for me.

    • Love 1
  14. 6 hours ago, shishishi said:

    does anyone know how to fix this? 

    the server is working but this warning is so boring

    24c6b145c1.PNG

    d51fb7734d.PNG

     

    Its not the best way, but if you build it in release mode (not debug) probably will solve the problem. Also if you use vs13 probably you won't get this problem. (Btw the best way would be debug the core properly to see what's causes this problem...)

    • Dislove 1
    • Love 1
  15. 1 hour ago, Thanatos said:

    no i dont have any errors about this system in server or client.its strage...when i click on depo administrator on tradehouse nothing happen.:(

    Hmm well then I don't have any idea, maybe you should try to set it up again from the beginning, maybe you missed something... Sorry, but I can't say more without any error :(

    5 minutes ago, ScreamMyName said:

    Very nice mate. You could easily sell this system. Some work on python still needs to be done to make it look more appealing otherwise it looks good! Great job.

    Thank you, well as I mentioned it in my first post I decided to make this thing for free. I know that it doesn't looks so nice, and it uses a bit old methods so I decided to rework this whole thing during the summer with better techniques, methods and with more compatibility. The basic system will remains free of course, but maybe I will create some add-ons that will can be bought.

    • Love 2
  16. 23 minutes ago, Sephere92 said:

    I got some problem when I trie to activate the system.

    If i press any button of the tradehouse except the search, and the sell items then I will get this input box, but I still dont know why. I have checked every little thing, every file, but cannot solve the problem.

    BTW, the system works well, and working.

    Can someone help me to solve it?

    Here is a pic. , and the channel 1 syserr:

    SYSERR: Jan 30 06:22:29.635951 :: Input: no quest running for pc, cannot process input : 1
    SYSERR: Jan 30 06:22:31.46984 :: Input: no quest running for pc, cannot process input : 1
    SYSERR: Jan 30 06:22:42.815891 :: Input: no quest running for pc, cannot process input : 1
    SYSERR: Jan 30 06:22:46.214774 :: Input: no quest running for pc, cannot process input : 1

    I think it is caused by that I press the OK button of the box but maybe it could help.

     

    864113311N_vtelen_www.kepfeltoltes.hu_.p

    You didn't add correctly the INPUT_IGNORE in the client part...

    On 2015. 12. 12. at 7:00 PM, kimameixede said:

    how can i use inventory money?

     

    I do not like to use the gold bars

    You can't in this version... Its necessary because when I designed this system there was no chance to extend the limit of maximum gold.

    On 2015. 12. 09. at 10:49 PM, Eigenartig said:

    +1 for labor -1 for codestyle/logic and my point is 0 for you

    You are absolutely right. Since this was my first bigger project about 1.5 years ago, my knowledge about programming was more less than now. Originally I designed the system for only one server, so because this I didn't think about doing the script "flexible"/"universal". Also in the first times I thought "oh its nothing, it will be a small system" so I didn't make flexible automatic code generation for the GUIs... I'm sure if I cared more about coding it wouldn't be as long as now it is... Btw while I was working on this system I learned tons of things (also from the people's feedbacks) so in the future I can build even better codes/systems.

    I'm planning to re-create this system during the summer with packet communication (only python/c++) instead of the old python-lua communication and with a more player-friendly GUI.

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.