-
Posts
235 -
Joined
-
Last visited
-
Days Won
28 -
Feedback
100%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by masodikbela
-
-
On 2017. 03. 13. at 10:20 AM, xP3NG3Rx said:
First of all you need to know:
- I don't help to install it. Don't even take the contact with me about it.
- The whole code is written by me, and reversed from official binaries.
- At the beginning do a backup for your files(srcs+pys) and READ CAREFULLY the readme.
- W/o brain.exe please close this tab, or your browser, thank you for your understanding.
- 6
-
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.hSpoilerAfter 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.cppSpoilerAfter 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
SpoilerIn 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
SpoilerIn 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
SpoilerAfter this:
bool operator == (const CGraphicImageInstance & rhs) const;
Add this:
D3DXCOLOR GetPixelColor(int x, int y);
EterLib\GrpImageInstance.cpp
SpoilerAdd 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- 16
- 1
- 2
- 1
- 30
-
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
SpoilerWhen 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
Spoilerserver/char.cpp
SpoilerAdd 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
SpoilerAdd 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
SpoilerIn 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
SpoilerIn 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- 7
- 33
-
The short answer:
SpoilerThe long answer:
SpoilerYou 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.
- 1
- 4
-
I didn't read the whole, but for me the "vid" fix is missing... (correct me if I'm wrong) here is mine: https://pastebin.com/gbYUKKP7
-
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)
-
8 minutes ago, ds_aim said:
And make him recognize these signs. https://metin2.download/picture/botvJVc57xTxJRxxVAj8oe3vassj1B33/.png
This is in the property, some of its folders/files have Chinese chars in its names. Basically it won't cause any problem (for me) all of the packers can handle this things without problem.
-
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.
- 2
-
I'm using mainline, and no, thats all I have
-
I think my fix is enough, since I run into this problem when I was working on a real server (with players). After I made this fix the game stopped crashing so I don't think that other thing is necessary.
-
Without knowing whats the reason to do it, whats the bug that it causes, I can't say anything about it...
-
This is the only one that I know. Also I seen some trouble with the automatic deletion of dungeon IDs, but thats not a very serious problem.
-
Here you are: https://pastebin.com/QatrEsSu
Basic quest:
when hit begin syschat("kkty") if npc.is_pc() then syschat("ispc") end syschat(npc.get_level()) end when 101.hit begin syschat("101") end
- 3
-
How do you want? Hit the 'hit' trigger for that player who hit something (did dmg to it or something) or trigger when someone being hit by something.
-
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).
-
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):).
-
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?
-
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
SpoilerAs 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
Spoilersrc/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- 1
- 1
- 2
- 17
-
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
-
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.
- 1
-
6 hours ago, shishishi said:
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...)
- 1
- 1
-
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.
- 2
-
8 hours ago, Thanatos said:
for me quest dont work.when i try to click on tradehouse(on depo administrator) dont apear this qui.
Any syserr in the client/server part (in that channel's folder where u tired to open)?
-
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 : 1I think it is caused by that I press the OK button of the box but maybe it could help.
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.
Transparency Check for Images
in Programming & Scripts
Posted · Edited by Metin2 Dev
Core X - External 2 Internal
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...