-
Posts
71 -
Joined
-
Last visited
-
Days Won
9 -
Feedback
100%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by Rakancito
-
-
5 hours ago, msnas said:
That's definitely going to crash the server.
@ Rakancito, can you explain how you thought process of this code?OK maybe you need more primary studies for understand...
REMEMBER: THIS IS CONTRIBUTION AND I SAID...
QuoteThis is all interface about SungmaHee Tower Like official servers and the first floor like Official Servers, In this files we have 2k or 3k LOC, maybe more, I'm tired and I don't have information about all floor's tower, but if you want complete this system, you can contact with some-developer and providing the information about the floors or modifying all floors like your concept for Metin2, you'll be a nice dungeon. I already did the hardest part.
Maybe you need understand more about: "This is all interface about SungmaHee Tower Like official servers and the first floor like Official Servers" and the other part about " I'm tired and I don't have information about all floor's tower, but if you want complete this system, you can contact with some-developer". I commented that I didn't give them the whole dungeon because I'm tired and I had incomplete information I was without information about the dungeon.
Obiously I give you the more important part about interface... and you can complete this system with anydeveloper, you just need check all floors with the logic by the code. Just remove the problem lol.
The difference between those who want everything for free and those who take advantage of opportunities to do work is this. I just decided to share something and indicated that I am tired and I have no information about the floors, maybe if someone gives me information about the floors I will complete it or you can fill it out.
- 2
- 2
-
53 minutes ago, WeedHex said:
Checking the pointer from the beginning, but controlling it again before destroy and then using again. The guy meant this with the arrows.
I agree about the use of LUA for dungeons. It's much faster and already prepared for use, without risk of memory, at the end it's linking c++, you got less lines and more order/safety.
Obv it's good for pratice c++ doing as you did.
Thanks for the share, will be very useful for my Yohara
WTF??? YOU ARE WRONG!!
- All languages has advantages and disadvantages.
- C++ is faster than Lua.
- Lua is easier than C++.
- C++ has more good communication with the machine than Lua.
- C++ has debug tools.
- Lua is nice and good, but if you have bugs, you will need go to C++ if you want resolve the problem.
- Memory problems are programming errors, not programming language errors, and are due to poor programming practice or lack of code review.
- The order of the code does not equal the difficulty of understanding code (C++ is harder than Lua).
- You can cause important errors in Lua and memory problems just like in C++
And I can continue with disadvantages or advantages.
If you have more Lua developers it's because Lua is more easier than C++, Lua has one syntax more easy. But if you have good practices and concepts of programming, you will have a good code and secure code.
In my personal think, C++ has advantages because it's more fast and has one more communication with the machine than Lua, but the project will be more expensive and complicated.It is simply to the client's liking. But C++ will always be better than Lua in many ways. Only Lua is easier to learn and anyone can be a Lua developer.
Lua has nice helps for inexpert developers and good practices for codes with small size however C++ has advantages with big codes.
- If you have a big new bug in Lua you go to C++.
- C++ has great tools with debug for codes. If you use a good testing techniques you will have a super-tool.
In summary: Lua and C++ are good, but C++ is harder to learn. For this reason, although C++ is better for big code, because it's more faster and more advantages, it is avoided due to the cost it represents. Not everyone is a C++ developer.
- 1
- 1
- 1
-
4 hours ago, envy said:
I like to avoid tragedies even if I have avoided them before. If you don't like C++ code, use Lua, but... since when is a high-level language better than a low-level?
2 hours ago, CantSt0p said:Yoy @ Rakancito reupload last image. You are showing us your server IP
I'm not using the server, I don't have problems.
-
Hi,
This is all interface about SungmaHee Tower Like official servers and the first floor like Official Servers, In this files we have 2k or 3k LOC, maybe more, I'm tired and I don't have information about all floor's tower, but if you want complete this system, you can contact with some-developer and providing the information about the floors or modifying all floors like your concept for Metin2, you'll be a nice dungeon. I already did the hardest part.
You can extract all visual part with the official patchs from this forum.
This dungeon is Full C++, Python and SQL.
PLEASE: Not more messages for my person if you don't want to pay money, I only sell systems "not personal systems" you need understand about my time, my help, code or resolve some problem, needs time.
If you want something (not offlineshop, this world has different options with this system) you can contact me but, you will need understand that I will charge you.
I'm a nice person (I think), but this world needs money and if I invest time in one project, I will cancel other projects and is overmoney.
- 82
- 13
- 1
- 31
-
5 hours ago, metrix2020 said:
Hey, i tryed to install razador dungeon but i got a problem with the quest, i miss some functions, can someone help me?
SYSERR: Jan 4 18:30:46 :: RunState: LUA_ERROR: [string "flame_dungeon"]:19: attempt to call field `check_event' (a nil value)
SYSERR: Jan 4 18:30:46 :: WriteRunningStateToSyserr: LUA_ERROR: quest flame_dungeon.start click
Check if you have in quest_functions and if you not, just add.
game.check_event
game.check_event
Maybe you will not have the C++ function and you can try commenting the part of code, the quest is very easy, you can develop other quest only for the enter to Dungeon. -
Hi guys.
This is my goodbye, I had 10 years working for Metin2 but in the last days I finished my all contracts with Metin2. New year, new projects.
I hope you continue to improve your codes.I give special thanks for my unic friend on Metin2 "Capone" because he was the one who showed me that true friendship exists.
I know that Metin2 has nice people "Community Developers" and Big Developers: VegaS and Mali, you don't know about me, but I observed your works and is very cool.I wish you a beautiful new Year and good luck in your future projects.
I leave with my last contribution "GIFT" for the community.
Basic Dungeons:
[C++] Nemere and Flame Dungeon like Official servers:
SpoilerDungeons with Conqueror of Yohara stats:
[C++] White Dragon
Spoiler[C++] Queen Nethis
SpoilerNOTE: If I forgot visuals parts, you can extract from the official client.
Maybe I will have connections in the forum but just of curiosity. I love you guys, I hope you are very well with my gifts.
Good bye.
- 234
- 1
- 1
- 1
- 1
- 1
- 3
- 56
- 14
- 143
-
3 hours ago, VegasForPresident said:
Still core crash bro.. why i cant use the other one? Everything work good there
@ Mali It works after i change BYTE to INT ..
for (int i = 0; i < MAX_APPLY_NUM; ++i)
{
const TItemAttrTable& r = g_map_itemAttr[i];if (r.bMaxLevelBySet[iAttributeSet] && !__HasAttr(i))
{
avail.push_back(i);
total += r.dwProb;
}
}Mali i can prove it to u if u dont believe give me your discord addy its because of byte / int
I'm tired.I was in Match League of Legends (I had Games over ) This is the problem:
Your solution it's good because the problem in the function is, we have a mapping, not a direct search::
Quoteavail.push_back(i);
The array Data Struct it's declared like DWORD, and we are searching in BYTE, in general we should not have problems but we have Crazy Compilers.
I didn't make the mistake before because I forgot.
OK, if we come back for this, we need check the Word Size Data Types (The most important), Is nice if we use Short Data Types for a some values, but we need check if our Struct's have same declared data types.
DWORD = 4 bytes, int = 4 bytes
BYTE = 2 bytes
If we search with 2 bytes, we will have errors in the future, if we search with a other Data type with more bytes, we will have errors, but if we will check with = sizes we have nice functions.
The logic is simple: We don't put a bigger box in a smaller box. (Computer architecture)
The fix it's in your for changed for int or DWORD, (Just if you have problems), Maybe in new compiler versions that was corrected or not.
Now how do I remove notifications from this topic?, I have SPAM.
I love you Muack, nice system.
- 1
-
1 hour ago, VegasForPresident said:
@ Mali terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_allocCore crash after taking item on item2 (not even the select attr window is opened)
anyone else ? why
std::bad_alloc It's because you have a serious memory allocation problem, maybe you will need say if it happened on the first try or after many try's, but I think that you but i think you need to check all your code or check if you have any missing code snippets.
I haven't had problems, although I arranged some fragments in my own way.
https://metin2.download/picture/klRi93Xd3QFXt1eF0Rj4yJWfQyACU96t/.jpg
- 1
-
Nice, good job, I don't know if it was intentional or it's like Official Servers, but I think he forgot the way Metin2 interprets Attribute levels.
Right now you only call the level but not the attribute stored in your Data Struct.
For correct call for level Attributes you will need add a some part for your code:
Search in from item_attribute.cpp:Quotevoid CItem::GetSelectAttr(TPlayerItemAttribute(&arr)[ITEM_ATTRIBUTE_MAX_NUM])
{
[...]
arr[__GetAttributeCount()] = { static_cast<BYTE>(attr_idx), static_cast<short>(bLevel) };
};
and replace for:Quotelong lVal = r.lValues[MIN(4, bLevel - 1)];
arr[__GetAttributeCount()] = { static_cast<BYTE>(attr_idx), lVal };
};
And after will working perfectlyI love you, muack
- 1
-
Ok If you are using the shared system you can with my introselect.py because have all Yohara System, I hope it helps for you, just search for:
Quoteif app.ENABLE_CONQUEROR_LEVEL:
Quote
import grp
import os
import dbgimport math
import wndMgr
import sndimport systemSetting
import localeInfo
import ui
import uiScriptlocale
import networkModule
import musicInfo
import playerSettingModule
import localeworldard
import event
####################################
# 빠른 실행을 위한 모듈 로딩 분담
####################################
import uiCommon
import uiMapNameShower
import uiAffectShower
import uiCharacter
import uiTarget
import consoleModule
import interfaceModule
import uiTaskBar
import uiInventory
import uiScriptLocale###################################
import net
import app
import chr
import chrmgr
import playerif app.ENABLE_CONQUEROR_LEVEL:
import uiToolTip
LEAVE_BUTTON_FOR_POTAL = FALSE
NOT_NEED_DELETE_CODE = FALSE
ENABLE_ENGNUM_DELETE_CODE = FALSEif localeInfo.IsJAPAN():
NOT_NEED_DELETE_CODE = TRUE
elif localeInfo.IsHONGKONG():
ENABLE_ENGNUM_DELETE_CODE = TRUE
elif localeInfo.IsNEWCIBN() or localeInfo.IsCIBN10():
ENABLE_ENGNUM_DELETE_CODE = TRUE
elif localeInfo.IsEUROPE():
ENABLE_ENGNUM_DELETE_CODE = TRUE###################################
class DescWorldIndex(ui.DescWorld.DescWorldIndex):
def __init__(self, fileName):
ui.DescWorld.DescWorldIndex.__init__(self)
self.text=fileName
self.textLine=self.__CreateTextLine(fileName[:33])def __del__(self):
ui.DescWorld.DescWorldIndex.__del__(self)def GetText(self):
return self.textdef __CreateTextLine(self, fileName):
textLine=ui.TextLine()
textLine.SetParent(self)
textLine.SetPosition(0, 0)
textLine.SetText(fileName)
textLine.Show()
return textLineclass SelectCharacterWindow(ui.Window):
# SLOT4
#SLOT_COUNT = 3
SLOT_COUNT = 4
CHARACTER_TYPE_COUNT = 4EMPIRE_NAME = {
net.EMPIRE_A : localeInfo.EMPIRE_A,
net.EMPIRE_B : localeInfo.EMPIRE_B,
net.EMPIRE_C : localeInfo.EMPIRE_C
}class CharacterRenderer(ui.Window):
def OnRender(self):
grp.ClearDepthBuffer()grp.SetGameRenderState()
grp.PushState()
grp.SetOmniLight()screenWidth = wndMgr.GetScreenWidth()
screenHeight = wndMgr.GetScreenHeight()
newScreenWidth = float(screenWidth - 270)
newScreenHeight = float(screenHeight)grp.SetViewport(270.0/screenWidth, 0.0, newScreenWidth/screenWidth, newScreenHeight/screenHeight)
app.SetCenterPosition(-60.0, -160.0, -45.0)
app.SetCamera(1550.0, 15.0, 180.0, 95.0)
grp.SetPerspective(11.0, newScreenWidth/newScreenHeight, 1000.0, 3000.0)(x, y) = app.GetCursorPosition()
grp.SetCursorPosition(x, y)chr.Deform()
chr.Render()grp.RestoreViewport()
grp.PopState()
grp.SetInterfaceRenderState()def __init__(self, stream):
ui.Window.__init__(self)
net.SetPhaseWindow(net.PHASE_WINDOW_SELECT, self)self.stream=stream
self.slot = self.stream.GetCharacterSlot()self.openLoadingFlag = FALSE
self.startIndex = -1
self.startReservingTime = 0
self.EmpireImage = {}
self.curGauge = [0.0, 0.0, 0.0, 0.0]
self.destGauge = [0.0, 0.0, 0.0, 0.0]
self.descIndex = 0
self.fileListBox = 0self.dlgBoard = 0
self.changeNameFlag = FALSE
self.nameInputBoard = None
self.sendedChangeNamePacket = FALSEself.startIndex = -1
self.isLoad = 0if app.ENABLE_CONQUEROR_LEVEL:
self.toolTipConquerorInfoButton = None
def __del__(self):
ui.Window.__del__(self)
net.SetPhaseWindow(net.PHASE_WINDOW_SELECT, 0)def Open(self):
if not self.__LoadBoardDialog(uiScriptlocale.LOCALE_UISCRIPT_PATH + "selectcharacterwindow.py"):
dbg.TraceError("SelectCharacterWindow.Open - __LoadScript Error")
returnif not self.__LoadQuestionDialog("uiscript/questiondialog.py"):
returnplayerSettingModule.LoadGameData("INIT")
self.InitCharacterBoard()
self.btnStart.Enable()
self.btnCreate.Disable()
self.btnCreate.Show()
self.btnDelete.Enable()
self.btnExit.Enable()self.dlgBoard.Show()
self.SetWindowName("SelectCharacterWindow")
self.Show()
if self.slot>=0:
self.SelectSlot(self.slot)if musicInfo.selectMusic != "":
snd.SetMusicVolume(systemSetting.GetMusicVolume())
snd.FadeInMusic("BGM/"+musicInfo.selectMusic)app.SetCenterPosition(0.0, 0.0, 0.0)
app.SetCamera(1550.0, 15.0, 180.0, 95.0)self.isLoad=1
self.Refresh()if self.stream.isAutoSelect:
chrSlot=self.stream.GetCharacterSlot()
self.SelectSlot(chrSlot)
self.StartGame()self.HideAllFlag()
self.SetEmpire(net.GetEmpireID())
self.BackGround()
self.SelectSlotWorl(0)if app.ENABLE_CONQUEROR_LEVEL:
self.btnSungmaPrev.Enable()
self.btnSungmaNext.Enable()app.ShowCursor()
def Close(self):
if musicInfo.selectMusic != "":
snd.FadeOutMusic("BGM/"+musicInfo.selectMusic)self.stream.popupWindow.Close()
if self.dlgBoard:
self.dlgBoard.ClearDictionary()self.dlgBoard = None
self.btnStart = None
self.btnCreate = None
self.btnDelete = None
self.btnExit = None
self.backGroundShinsoo = None
self.backGroundJinnos = None
self.backGroundChunjo = None
self.backGroundNone = None
self.empireName = None
self.EmpireImage = {}self.dlgQuestion.ClearDictionary()
self.dlgQuestion = None
self.dlgQuestionText = None
self.dlgQuestionAcceptButton = None
self.dlgQuestionCancelButton = None
self.privateInputBoard = None
self.nameInputBoard = Noneif app.ENABLE_CONQUEROR_LEVEL:
self.toolTipConquerorInfoButton = None
self.btnSungmaPrev = None
self.btnSungmaNext = None
chr.DeleteInstance(0)
chr.DeleteInstance(1)
chr.DeleteInstance(2)
chr.DeleteInstance(3)self.Hide()
self.KillFocus()app.HideCursor()
event.Destroy()def SetEmpire(self, id):
if self.__AreAllSlotEmpty():
self.empireName.Hide()
self.EmpireImage[id].Hide()
self.backGroundNone.Show()
else:
self.empireName.SetText(self.EMPIRE_NAME.get(id, ""))
if self.EmpireImage.has_key(id):
self.EmpireImage[id].Show()
def HideAllFlag(self):
for flag in self.EmpireImage.values():
flag.Hide()def BackGround(self):
empire = net.GetEmpireID()
if self.__AreAllSlotEmpty():
self.backGroundShinsoo.Hide()
self.backGroundJinnos.Hide()
self.backGroundChunjo.Hide()
self.backGroundNone.Show()
else:
if empire == 1:
self.backGroundShinsoo.Show()
self.backGroundJinnos.Hide()
self.backGroundChunjo.Hide()
self.backGroundNone.Hide()
self.empireName.SetPackedFontColor(0xffBD0514)
if empire == 2:
self.backGroundShinsoo.Hide()
self.backGroundJinnos.Hide()
self.backGroundChunjo.Show()
self.backGroundNone.Hide()
self.empireName.SetPackedFontColor(0xffBDA805)
if empire == 3:
self.backGroundShinsoo.Hide()
self.backGroundJinnos.Show()
self.backGroundChunjo.Hide()
self.backGroundNone.Hide()
self.empireName.SetPackedFontColor(0xff1705BD)def Refresh(self):
if not self.isLoad:
returnindexArray = (3, 2, 1, 0)
for index in indexArray:
id=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_ID)
race=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_RACE)
form=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_FORM)
name=net.GetAccountCharacterSlotDataString(index, net.ACCOUNT_CHARACTER_SLOT_NAME)
level=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_LEVEL)
hair=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_HAIR)
acce=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_ACCE)if app.ENABLE_CONQUEROR_LEVEL:
conquerorlevel = net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_CONQUEROR_LEVEL)
if id:
self.MakeCharacter(index, id, name, race, form, hair, acce)
self.SelectSlot(index)self.SelectSlot(self.slot)
def GetCharacterSlotID(self, slotIndex):
return net.GetAccountCharacterSlotDataInteger(slotIndex, net.ACCOUNT_CHARACTER_SLOT_ID)def __LoadQuestionDialog(self, fileName):
self.dlgQuestion = ui.ScriptWindow()try:
pyScrLoader = ui.PythonScriptLoader()
pyScrLoader.LoadScriptFile(self.dlgQuestion, fileName)
except:
import exception
exception.Abort("SelectCharacterWindow.LoadQuestionDialog.LoadScript")try:
GetObject=self.dlgQuestion.GetChild
self.dlgQuestionText=GetObject("message")
self.dlgQuestionAcceptButton=GetObject("accept")
self.dlgQuestionCancelButton=GetObject("cancel")
except:
import exception
exception.Abort("SelectCharacterWindow.LoadQuestionDialog.BindObject")self.dlgQuestionText.SetText(localeInfo.SELECT_DO_YOU_DELETE_REALLY)
self.dlgQuestionAcceptButton.SetEvent(ui.__mem_func__(self.RequestDeleteCharacter))
self.dlgQuestionCancelButton.SetEvent(ui.__mem_func__(self.dlgQuestion.Hide))
return 1def __LoadBoardDialog(self, fileName):
self.dlgBoard = ui.ScriptWindow()try:
pyScrLoader = ui.PythonScriptLoader()
pyScrLoader.LoadScriptFile(self.dlgBoard, fileName)
except:
import exception
exception.Abort("SelectCharacterWindow.LoadBoardDialog.LoadScript")try:
GetObject=self.dlgBoard.GetChild#Buttons Go
self.btnStart = GetObject("start_button")
self.btnExit = GetObject("exit_button")
self.btnCreate = GetObject("create_button")
self.btnDelete = GetObject("delete_button")
#Buttons End## Name Job Go
self.name_warrior= GetObject("name_warrior")
self.name_assassin= GetObject("name_assassin")
self.name_sura= GetObject("name_sura")
self.name_shaman= GetObject("name_shaman")
self.name_wolfman =GetObject("name_wolfman")
## Name Job Endself.empireName = GetObject("EmpireName")
self.EmpireImage[net.EMPIRE_A] = GetObject("EmpireFlag_A")
self.EmpireImage[net.EMPIRE_B] = GetObject("EmpireFlag_B")
self.EmpireImage[net.EMPIRE_C] = GetObject("EmpireFlag_C")self.textBoard = GetObject("text_board")
self.CharacterHTH = GetObject("hth_value")
self.CharacterINT = GetObject("int_value")
self.CharacterSTR = GetObject("str_value")
self.CharacterDEX = GetObject("dex_value")
self.CharacterName_0 = GetObject("CharacterName_0")
self.CharacterName_1 = GetObject("CharacterName_1")
self.CharacterName_2 = GetObject("CharacterName_2")
self.CharacterName_3 = GetObject("CharacterName_3")
self.CharacterLevel_0 = GetObject("CharacterLevel_0")
self.CharacterLevel_1 = GetObject("CharacterLevel_1")
self.CharacterLevel_2 = GetObject("CharacterLevel_2")
self.CharacterLevel_3 = GetObject("CharacterLevel_3")
self.CharacterTime_01 = GetObject("CharacterTime_01")
self.CharacterTime_02 = GetObject("CharacterTime_02")
self.CharacterTime_03 = GetObject("CharacterTime_03")
self.CharacterTime_04 = GetObject("CharacterTime_04")
self.CharacterGuild_01 = GetObject("CharacterGuild_01")
self.CharacterGuild_02 = GetObject("CharacterGuild_02")
self.CharacterGuild_03 = GetObject("CharacterGuild_03")
self.CharacterGuild_04 = GetObject("CharacterGuild_04")
self.text_board = GetObject("text_board")
self.GaugeList = []
self.GaugeList.append(GetObject("hth_gauge"))
self.GaugeList.append(GetObject("int_gauge"))
self.GaugeList.append(GetObject("str_gauge"))
self.GaugeList.append(GetObject("dex_gauge"))if app.ENABLE_CONQUEROR_LEVEL:
self.toolTipConquerorInfoButton = uiToolTip.ToolTip()
self.btnSungmaPrev = GetObject("origin_stat_button")
self.btnSungmaNext = GetObject("sungma_stat_button")
self.HTH_IMG = GetObject("hth_img")
self.INT_IMG = GetObject("int_img")
self.STR_IMG = GetObject("str_img")
self.DEX_IMG = GetObject("dex_img")
self.HTH_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowHTHToolTip)
self.HTH_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideHTHToolTip)
self.INT_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowINTToolTip)
self.INT_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideINTToolTip)
self.STR_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowSTRToolTip)
self.STR_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideSTRToolTip)
self.DEX_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowDEXToolTip)
self.DEX_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideDEXToolTip)
self.SUNGMA_ST_IMG = GetObject("sungma_str_img")
self.SUNGMA_HP_IMG = GetObject("sungma_hp_img")
self.SUNGMA_MOVE_IMG = GetObject("sungma_move_img")
self.SUNGMA_INMUNE_IMG = GetObject("sungma_immune_img")self.SUNGMA_ST_IMG.Hide()
self.SUNGMA_HP_IMG.Hide()
self.SUNGMA_MOVE_IMG.Hide()
self.SUNGMA_INMUNE_IMG.Hide()
self.SUNGMA_ST_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowSTToolTip)
self.SUNGMA_ST_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideSTToolTip)
self.SUNGMA_HP_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowHPToolTip)
self.SUNGMA_HP_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideHPToolTip)
self.SUNGMA_MOVE_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMOVEToolTip)
self.SUNGMA_MOVE_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMOVEToolTip)
self.SUNGMA_INMUNE_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowINMUNEToolTip)
self.SUNGMA_INMUNE_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideINMUNEToolTip)
self.CharacterFace_0 = GetObject("CharacterFace_0")
self.CharacterFace_0.Hide()
self.CharacterFace_1 = GetObject("CharacterFace_1")
self.CharacterFace_1.Hide()
self.CharacterFace_2 = GetObject("CharacterFace_2")
self.CharacterFace_2.Hide()
self.CharacterFace_3 = GetObject("CharacterFace_3")
self.CharacterFace_3.Hide()self.CharacterSlot = []
self.CharacterSlot.append(GetObject("CharacterSlot_0"))
self.CharacterSlot.append(GetObject("CharacterSlot_1"))
self.CharacterSlot.append(GetObject("CharacterSlot_2"))
self.CharacterSlot.append(GetObject("CharacterSlot_3"))self.DiscFace = GetObject("DiscFace")
self.DiscFace.Hide()
self.raceName_Text = GetObject("raceName_Text")self.Board_Date_1 = GetObject("board_date_01")
self.Board_Date_1.Hide()
self.Board_Date_2 = GetObject("board_date_02")
self.Board_Date_2.Hide()
self.Board_Date_3 = GetObject("board_date_03")
self.Board_Date_3.Hide()
self.Board_Date_4 = GetObject("board_date_04")
self.Board_Date_4.Hide()
self.backGroundShinsoo = GetObject("backGroundShinsoo")
self.backGroundJinnos = GetObject("backGroundJinnos")
self.backGroundChunjo = GetObject("backGroundChunjo")
self.backGroundNone = GetObject("backGroundNone")self.ButtonUp = ui.ButtonWorldArdUp()
self.ButtonUp.SetParent(self.textBoard)
self.ButtonUp.SetPosition(122,250)
self.ButtonUp.SetButtonDownSize(160)
self.ButtonUp.SetScrollStep(1.4)
self.ButtonUp.Show()self.ButtonDown = ui.ButtonWorldArdDown()
self.ButtonDown.SetParent(self.textBoard)
self.ButtonDown.SetPosition(122 + 20 + 10,250)
self.ButtonDown.SetButtonDownSize(160)
self.ButtonDown.SetScrollStep(1.4)
self.ButtonDown.Show()
self.fileListBox = ui.DescWorld()
self.fileListBox.SetParent(self.textBoard)
self.fileListBox.SetPosition(20, 20)
self.fileListBox.SetViewLines(11)
self.fileListBox.ButtonWorldArdDown(self.ButtonDown)
self.fileListBox.ButtonWorldArdUp(self.ButtonUp)
self.fileListBox.Show()
except:
import exception
exception.Abort("SelectCharacterWindow.LoadBoardDialog.BindObject")self.btnStart.SetEvent(ui.__mem_func__(self.StartGame))
self.btnCreate.SetEvent(ui.__mem_func__(self.CreateCharacter))
self.btnExit.SetEvent(ui.__mem_func__(self.ExitSelect))
self.CharacterSlot[0].SAFE_SetEvent(self.__CharacterSlot_01)
self.CharacterSlot[1].SAFE_SetEvent(self.__CharacterSlot_11)
self.CharacterSlot[2].SAFE_SetEvent(self.__CharacterSlot_21)
self.CharacterSlot[3].SAFE_SetEvent(self.__CharacterSlot_31)if app.ENABLE_CONQUEROR_LEVEL:
self.btnSungmaPrev.SetEvent(ui.__mem_func__(self.SungmaPrev))
self.btnSungmaNext.SetEvent(ui.__mem_func__(self.SungmaNext))
if NOT_NEED_DELETE_CODE:
self.btnDelete.SetEvent(ui.__mem_func__(self.PopupDeleteQuestion))
else:
self.btnDelete.SetEvent(ui.__mem_func__(self.InputPrivateCode))self.chrRenderer = self.CharacterRenderer()
self.chrRenderer.SetParent(self.backGroundShinsoo)
self.chrRenderer.Show()self.chrRenderer1 = self.CharacterRenderer()
self.chrRenderer1.SetParent(self.backGroundJinnos)
self.chrRenderer1.Show()self.chrRenderer2 = self.CharacterRenderer()
self.chrRenderer2.SetParent(self.backGroundChunjo)
self.chrRenderer2.Show()self.chrRenderer3 = self.CharacterRenderer()
self.chrRenderer3.SetParent(self.backGroundNone)
self.chrRenderer3.Show()return 1
if app.ENABLE_CONQUEROR_LEVEL:
def SungmaPrev(self):
self.SUNGMA_ST_IMG.Hide()
self.SUNGMA_HP_IMG.Hide()
self.SUNGMA_MOVE_IMG.Hide()
self.SUNGMA_INMUNE_IMG.Hide()
valueHTH=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_HTH)
valueINT=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_INT)
valueSTR=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_STR)
valueDEX=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_DEX)
self.CharacterHTH.SetText(str(valueHTH))
self.CharacterINT.SetText(str(valueINT))
self.CharacterSTR.SetText(str(valueSTR))
self.CharacterDEX.SetText(str(valueDEX))self.destGauge = [0.0, 0.0, 0.0, 0.0]
statesSummary = float(valueHTH + valueINT + valueSTR + valueDEX)
if statesSummary > 0.0:
self.destGauge = [
float(valueHTH) / statesSummary,
float(valueINT) / statesSummary,
float(valueSTR) / statesSummary,
float(valueDEX) / statesSummary
]
for i in xrange(4):
self.curGauge[i] += (self.destGauge[i] - self.curGauge[i]) / 10.0
if abs(self.curGauge[i] - self.destGauge[i]) < 0.005:
self.curGauge[i] = self.destGauge[i]
self.GaugeList[i].SetPercentage(self.curGauge[i], 1.0)
def SungmaNext(self):
self.SUNGMA_ST_IMG.Show()
self.SUNGMA_HP_IMG.Show()
self.SUNGMA_MOVE_IMG.Show()
self.SUNGMA_INMUNE_IMG.Show()
valueConquerorST=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_SUNGMA_ST)
valueConquerorHP=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_SUNGMA_HP)
valueConquerorMOVE=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_SUNGMA_MOVE)
valueConquerorINMUNE=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_SUNGMA_INMUNE)
self.CharacterHTH.SetText(str(valueConquerorST))
self.CharacterINT.SetText(str(valueConquerorHP))
self.CharacterSTR.SetText(str(valueConquerorMOVE))
self.CharacterDEX.SetText(str(valueConquerorINMUNE))
self.destGauge = [0.0, 0.0, 0.0, 0.0]
statesSummary = float(valueConquerorST + valueConquerorHP + valueConquerorMOVE + valueConquerorINMUNE)
if statesSummary > 0.0:
self.destGauge = [
float(valueConquerorST) / statesSummary,
float(valueConquerorHP) / statesSummary,
float(valueConquerorMOVE) / statesSummary,
float(valueConquerorINMUNE) / statesSummary
]
for i in xrange(4):
self.curGauge[i] += (self.destGauge[i] - self.curGauge[i]) / 10.0
if abs(self.curGauge[i] - self.destGauge[i]) < 0.005:
self.curGauge[i] = self.destGauge[i]
self.GaugeList[i].SetPercentage(self.curGauge[i], 1.0)
def __ShowHTHToolTip(self):
self.toolTipConquerorInfoButton.ClearToolTip()
self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_CON)
self.toolTipConquerorInfoButton.AlignHorizonalCenter()
self.toolTipConquerorInfoButton.ShowToolTip()def __HideHTHToolTip(self):
self.toolTipConquerorInfoButton.HideToolTip()def __ShowINTToolTip(self):
self.toolTipConquerorInfoButton.ClearToolTip()
self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_INT)
self.toolTipConquerorInfoButton.AlignHorizonalCenter()
self.toolTipConquerorInfoButton.ShowToolTip()def __HideINTToolTip(self):
self.toolTipConquerorInfoButton.HideToolTip()def __ShowSTRToolTip(self):
self.toolTipConquerorInfoButton.ClearToolTip()
self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_STR)
self.toolTipConquerorInfoButton.AlignHorizonalCenter()
self.toolTipConquerorInfoButton.ShowToolTip()def __HideSTRToolTip(self):
self.toolTipConquerorInfoButton.HideToolTip()
def __ShowDEXToolTip(self):
self.toolTipConquerorInfoButton.ClearToolTip()
self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_DEX)
self.toolTipConquerorInfoButton.AlignHorizonalCenter()
self.toolTipConquerorInfoButton.ShowToolTip()def __HideDEXToolTip(self):
self.toolTipConquerorInfoButton.HideToolTip()#Sungma
def __ShowSTToolTip(self):
self.toolTipConquerorInfoButton.ClearToolTip()
self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_SUNGMA_STR)
self.toolTipConquerorInfoButton.AlignHorizonalCenter()
self.toolTipConquerorInfoButton.ShowToolTip()def __HideSTToolTip(self):
self.toolTipConquerorInfoButton.HideToolTip()def __ShowHPToolTip(self):
self.toolTipConquerorInfoButton.ClearToolTip()
self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_SUNGMA_HP)
self.toolTipConquerorInfoButton.AlignHorizonalCenter()
self.toolTipConquerorInfoButton.ShowToolTip()def __HideHPToolTip(self):
self.toolTipConquerorInfoButton.HideToolTip()def __ShowMOVEToolTip(self):
self.toolTipConquerorInfoButton.ClearToolTip()
self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_SUNGMA_MOVE)
self.toolTipConquerorInfoButton.AlignHorizonalCenter()
self.toolTipConquerorInfoButton.ShowToolTip()def __HideMOVEToolTip(self):
self.toolTipConquerorInfoButton.HideToolTip()
def __ShowINMUNEToolTip(self):
self.toolTipConquerorInfoButton.ClearToolTip()
self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_SUNGMA_INMUNE)
self.toolTipConquerorInfoButton.AlignHorizonalCenter()
self.toolTipConquerorInfoButton.ShowToolTip()def __HideINMUNEToolTip(self):
self.toolTipConquerorInfoButton.HideToolTip()
def MakeCharacter(self, index, id, name, race, form, hair, acce):
if 0 == id:
returnchr.CreateInstance(index)
chr.SelectInstance(index)
chr.SetVirtualID(index)
chr.SetNameString(name)
chr.SetRace(race)
chr.SetArmor(form)
chr.SetHair(hair)
if acce == 100:
chr.SetAcce(acce, 99)
else:
chr.SetAcce(acce, 0)
chr.Refresh()
chr.SetMotionMode(chr.MOTION_MODE_GENERAL)
chr.SetLoopMotion(chr.MOTION_INTRO_WAIT)chr.SetRotation(0.0)
def __ClickRadioButton(self, buttonList, buttonIndex):
try:
selButton=buttonList[buttonIndex]
except IndexError:
returnfor eachButton in buttonList:
eachButton.SetUp()selButton.Down()
def SelectSlotWorl(self, index):
self.SelectSlot(index)
self.__ClickRadioButton(self.CharacterSlot, index)def __CharacterSlot_01(self):
self.SelectSlotWorl(0)
def __CharacterSlot_11(self):
self.SelectSlotWorl(1)
def __CharacterSlot_21(self):
self.SelectSlotWorl(2)
def __CharacterSlot_31(self):
self.SelectSlotWorl(3)
## Manage Character
def StartGame(self):if self.sendedChangeNamePacket:
returnif self.changeNameFlag:
self.OpenChangeNameDialog()
returnif -1 != self.startIndex:
returnif musicInfo.selectMusic != "":
snd.FadeLimitOutMusic("BGM/"+musicInfo.selectMusic, systemSetting.GetMusicVolume()*0.05)self.btnStart.SetUp()
self.btnCreate.SetUp()
self.btnDelete.SetUp()
self.btnExit.SetUp()self.btnStart.Disable()
self.btnCreate.Disable()
self.btnDelete.Disable()
self.btnExit.Disable()
self.dlgQuestion.Hide()self.stream.SetCharacterSlot(self.slot)
if app.ENABLE_CONQUEROR_LEVEL:
self.btnSungmaNext.SetUp()
self.btnSungmaPrev.SetUp()
self.btnSungmaNext.Disable()
self.btnSungmaPrev.Disable()
self.startIndex = self.slot
self.startReservingTime = app.GetTime()for i in xrange(self.SLOT_COUNT):
if FALSE == chr.HasInstance(i):
continuechr.SelectInstance(i)
if i == self.slot:
self.slot=self.slot
chr.PushOnceMotion(chr.MOTION_INTRO_SELECTED, 0.1)
continuechr.PushOnceMotion(chr.MOTION_INTRO_NOT_SELECTED, 0.1)
def OpenChangeNameDialog(self):
import uiCommon
nameInputBoard = uiCommon.InputDialogWithDescription()
nameInputBoard.SetTitle(localeInfo.SELECT_CHANGE_NAME_TITLE)
nameInputBoard.SetAcceptEvent(ui.__mem_func__(self.AcceptInputName))
nameInputBoard.SetCancelEvent(ui.__mem_func__(self.CancelInputName))
nameInputBoard.SetMaxLength(chr.PLAYER_NAME_MAX_LEN)
nameInputBoard.SetBoardWidth(200)
nameInputBoard.SetDescription(localeInfo.SELECT_INPUT_CHANGING_NAME)
nameInputBoard.Open()
nameInputBoard.slot = self.slot
self.nameInputBoard = nameInputBoarddef OnChangeName(self, id, name):
self.SelectSlot(id)
self.sendedChangeNamePacket = FALSE
self.PopupMessage(localeInfo.SELECT_CHANGED_NAME)def AcceptInputName(self):
changeName = self.nameInputBoard.GetText()
if not changeName:
returnself.sendedChangeNamePacket = TRUE
net.SendChangeNamePacket(self.nameInputBoard.slot, changeName)
return self.CancelInputName()def CancelInputName(self):
self.nameInputBoard.Close()
self.nameInputBoard = None
return TRUEdef OnCreateFailure(self, type):
self.sendedChangeNamePacket = FALSE
if 0 == type:
self.PopupMessage(localeInfo.SELECT_CHANGE_FAILURE_STRANGE_NAME)
elif 1 == type:
self.PopupMessage(localeInfo.SELECT_CHANGE_FAILURE_ALREADY_EXIST_NAME)
elif 100 == type:
self.PopupMessage(localeInfo.SELECT_CHANGE_FAILURE_STRANGE_INDEX)def CreateCharacter(self):
id = self.GetCharacterSlotID(self.slot)if 0==id:
self.stream.SetCharacterSlot(self.slot)EMPIRE_MODE = 1
if EMPIRE_MODE:
if self.__AreAllSlotEmpty():
self.stream.SetReselectEmpirePhase()
else:
self.stream.SetCreateCharacterPhase()else:
self.stream.SetCreateCharacterPhase()def __AreAllSlotEmpty(self):
for iSlot in xrange(self.SLOT_COUNT):
if 0!=net.GetAccountCharacterSlotDataInteger(iSlot, net.ACCOUNT_CHARACTER_SLOT_ID):
return 0
return 1def PopupDeleteQuestion(self):
id = self.GetCharacterSlotID(self.slot)
if 0 == id:
returnself.dlgQuestion.Show()
self.dlgQuestion.SetTop()def RequestDeleteCharacter(self):
self.dlgQuestion.Hide()id = self.GetCharacterSlotID(self.slot)
if 0 == id:
self.PopupMessage(localeInfo.SELECT_EMPTY_SLOT)
returnnet.SendDestroyCharacterPacket(self.slot, "1234567")
self.PopupMessage(localeInfo.SELECT_DELEING)def InputPrivateCode(self):
import uiCommon
privateInputBoard = uiCommon.InputDialogWithDescription()
privateInputBoard.SetTitle(localeInfo.INPUT_PRIVATE_CODE_DIALOG_TITLE)
privateInputBoard.SetAcceptEvent(ui.__mem_func__(self.AcceptInputPrivateCode))
privateInputBoard.SetCancelEvent(ui.__mem_func__(self.CancelInputPrivateCode))if ENABLE_ENGNUM_DELETE_CODE:
pass
else:
privateInputBoard.SetNumberMode()privateInputBoard.SetSecretMode()
privateInputBoard.SetMaxLength(7)
privateInputBoard.SetBoardWidth(250)
privateInputBoard.SetDescription(localeInfo.INPUT_PRIVATE_CODE_DIALOG_DESCRIPTION)
privateInputBoard.Open()
self.privateInputBoard = privateInputBoarddef AcceptInputPrivateCode(self):
privateCode = self.privateInputBoard.GetText()
if not privateCode:
returnid = self.GetCharacterSlotID(self.slot)
if 0 == id:
self.PopupMessage(localeInfo.SELECT_EMPTY_SLOT)
returnnet.SendDestroyCharacterPacket(self.slot, privateCode)
self.PopupMessage(localeInfo.SELECT_DELEING)self.CancelInputPrivateCode()
return TRUEdef CancelInputPrivateCode(self):
self.privateInputBoard = None
return TRUEdef OnDeleteSuccess(self, slot):
self.PopupMessage(localeInfo.SELECT_DELETED)
self.DeleteCharacter(slot)def OnDeleteFailure(self):
self.PopupMessage(localeInfo.SELECT_CAN_NOT_DELETE)def DeleteCharacter(self, index):
chr.DeleteInstance(index)
self.SelectSlot(self.slot)def ExitSelect(self):
self.dlgQuestion.Hide()
if LEAVE_BUTTON_FOR_POTAL:
if app.loggined:
self.stream.SetPhaseWindow(0)
else:
self.stream.setloginphase()
else:
self.stream.SetLoginPhase()self.Hide()
def GetSlotIndex(self):
return self.slotdef DecreaseSlotIndex(self):
slotIndex = (self.GetSlotIndex() - 1 + self.SLOT_COUNT) % self.SLOT_COUNT
self.SelectSlot(slotIndex)def IncreaseSlotIndex(self):
slotIndex = (self.GetSlotIndex() + 1) % self.SLOT_COUNT
self.SelectSlot(slotIndex)def SelectSlot(self, index):
if index < 0:
return
if index >= self.SLOT_COUNT:
returnchr.DeleteInstance(0)
chr.DeleteInstance(1)
chr.DeleteInstance(2)
chr.DeleteInstance(3)self.slot = index
chr.SelectInstance(self.slot)
self.btnCreate.Show()
self.btnStart.Show()
self.btnDelete.Show()
self.destGauge = [0.0, 0.0, 0.0, 0.0]id=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_ID)
if 0 != id:self.btnStart.Enable()
self.btnDelete.Enable()
self.btnCreate.Disable()
self.btnCreate.Hide()level=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_LEVEL)
if app.ENABLE_CONQUEROR_LEVEL:
conquerorlevel=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_CONQUEROR_LEVEL)
race=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_RACE)
race_text=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_RACE)
race_img=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_RACE)
name=net.GetAccountCharacterSlotDataString(self.slot, net.ACCOUNT_CHARACTER_SLOT_NAME)
race_descrip=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_RACE)
form=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_FORM)
hair=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_HAIR)
acce=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_ACCE)
self.changeNameFlag=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_CHANGE_NAME_FLAG)
valueHTH=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_HTH)
valueINT=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_INT)
valueSTR=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_STR)
valueDEX=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_DEX)
playTime=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_PLAYTIME)
guildName=net.GetAccountCharacterSlotDataString(self.slot, net.ACCOUNT_CHARACTER_SLOT_GUILD_NAME)
if id:
self.MakeCharacter(self.slot, id, name, race, form, hair, acce)if race_text == 0 or race_text == 4:
race_text = localeworldard.Warrior
elif race_text == 1 or race_text == 5:
race_text = localeworldard.Assasin
elif race_text == 2 or race_text == 6:
race_text = localeworldard.Sura
elif race_text == 3 or race_text == 7:
race_text = localeworldard.Shaman
elif race_text == 8:
race_text = localeworldard.WolfManif race_img == 0 or race_img == 4:
self.name_warrior.Show()
self.name_assassin.Hide()
self.name_sura.Hide()
self.name_shaman.Hide()
self.name_wolfman.Hide()
elif race_img == 1 or race_img == 5:
self.name_assassin.Show()
self.name_warrior.Hide()
self.name_sura.Hide()
self.name_shaman.Hide()
self.name_wolfman.Hide()
elif race_img == 2 or race_img == 6:
self.name_sura.Show()
self.name_assassin.Hide()
self.name_warrior.Hide()
self.name_shaman.Hide()
self.name_wolfman.Hide()
elif race_img == 3 or race_img == 7:
self.name_shaman.Show()
self.name_assassin.Hide()
self.name_sura.Hide()
self.name_warrior.Hide()
self.name_wolfman.Hide()
elif race_img == 8:
self.name_shaman.Hide()
self.name_assassin.Hide()
self.name_sura.Hide()
self.name_warrior.Hide()
self.name_wolfman.Show()if race_descrip == 0 or race_descrip == 4:
f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_WARRIOR"],'r')
elif race_descrip == 1 or race_descrip == 5:
f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_ASSASSIN"],'r')
elif race_descrip == 2 or race_descrip == 6:
f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_SURA"],'r')
elif race_descrip == 3 or race_descrip == 7:
f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_SHAMAN"],'r')
elif race_descrip == 8:
f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_WOLFMAN"],'r')self.fileListBox.RemoveAllItems()
race_descrip
lines = f.readlines()
for i in lines:
self.fileListBox.AppendItem(DescWorldIndex(i.replace("[World]", "")))
self.raceName_Text.SetText(str(race_text))self.CharacterHTH.SetText(str(valueHTH))
self.CharacterINT.SetText(str(valueINT))
self.CharacterSTR.SetText(str(valueSTR))
self.CharacterDEX.SetText(str(valueDEX))
if self.slot == 0:
self.CharacterFace_0.LoadImage(localeworldard.CharacterFace[race])
self.DiscFace.LoadImage(localeworldard.DiscFace[race])
self.CharacterName_0.SetText(name)
if app.ENABLE_CONQUEROR_LEVEL:
if conquerorlevel:
self.CharacterLevel_0.SetText("Lv."+str(conquerorlevel))
self.CharacterLevel_0.SetPackedFontColor(0xFFBFD9FF)
else:
self.CharacterLevel_0.SetText("Lv."+str(level))
else:
self.CharacterLevel_0.SetText("Lv."+str(level))
self.CharacterTime_01.SetText(str(playTime))
self.CharacterGuild_01.SetText(guildName)
self.DiscFace.Show()
self.CharacterFace_0.Show()
self.Board_Date_1.Show()
self.Board_Date_2.Hide()
self.Board_Date_3.Hide()
self.Board_Date_4.Hide()
if guildName:
self.CharacterGuild_01.SetText(guildName)
else:
self.CharacterGuild_01.SetText(localeworldard.NotGuild)
second = int(playTime * 60) ##Minutos a Segundos
horas = int(second / 3600)
minutos = int((second - (horas * 3600)) / 60)if horas == 0:
self.CharacterTime_01.SetText(str(minutos)+localeworldard.Minutos)
if horas > 0:
self.CharacterTime_01.SetText(str(horas)+localeworldard.Horas+str(minutos)+localeworldard.Minutos)
elif self.slot == 1:
import time
self.CharacterFace_1.LoadImage(localeworldard.CharacterFace[race])
self.DiscFace.LoadImage(localeworldard.DiscFace[race])
self.CharacterName_1.SetText(name)
if app.ENABLE_CONQUEROR_LEVEL:
if conquerorlevel:
self.CharacterLevel_1.SetText("Lv."+str(conquerorlevel))
self.CharacterLevel_1.SetPackedFontColor(0xFFBFD9FF)
else:
self.CharacterLevel_1.SetText("Lv."+str(level))
else:
self.CharacterLevel_1.SetText("Lv."+str(level))
self.CharacterGuild_02.SetText(guildName)
self.DiscFace.Show()
self.Board_Date_1.Hide()
self.Board_Date_2.Show()
self.Board_Date_3.Hide()
self.Board_Date_4.Hide()
self.CharacterFace_1.Show()
if guildName:
self.CharacterGuild_02.SetText(guildName)
else:
self.CharacterGuild_02.SetText(localeworldard.NotGuild)second = int(playTime * 60) ##Minutos a Segundos
horas = int(second / 3600)
minutos = int((second - (horas * 3600)) / 60)if horas == 0:
self.CharacterTime_02.SetText(str(minutos)+localeworldard.Minutos)
if horas > 0:
self.CharacterTime_02.SetText(str(horas)+localeworldard.Horas+str(minutos)+localeworldard.Minutos)
elif self.slot == 2:
self.CharacterFace_2.LoadImage(localeworldard.CharacterFace[race])
self.DiscFace.LoadImage(localeworldard.DiscFace[race])
self.CharacterName_2.SetText(name)
if app.ENABLE_CONQUEROR_LEVEL:
if conquerorlevel:
self.CharacterLevel_2.SetText("Lv."+str(conquerorlevel))
self.CharacterLevel_2.SetPackedFontColor(0xFFBFD9FF)
else:
self.CharacterLevel_2.SetText("Lv."+str(level))
else:
self.CharacterLevel_2.SetText("Lv."+str(level))
self.Board_Date_1.Hide()
self.Board_Date_2.Hide()
self.Board_Date_3.Show()
self.Board_Date_4.Hide()
self.DiscFace.Show()
self.CharacterFace_2.Show()
if guildName:
self.CharacterGuild_03.SetText(guildName)
else:
self.CharacterGuild_03.SetText(localeworldard.NotGuild)
second = int(playTime * 60) ##Minutos a Segundos
horas = int(second / 3600)
minutos = int((second - (horas * 3600)) / 60)if horas == 0:
self.CharacterTime_03.SetText(str(minutos)+localeworldard.Minutos)
if horas > 0:
self.CharacterTime_03.SetText(str(horas)+localeworldard.Horas+str(minutos)+localeworldard.Minutos)
elif self.slot == 3:
self.CharacterFace_3.LoadImage(localeworldard.CharacterFace[race])
self.DiscFace.LoadImage(localeworldard.DiscFace[race])
self.CharacterName_3.SetText(name)
if app.ENABLE_CONQUEROR_LEVEL:
if conquerorlevel:
self.CharacterLevel_3.SetText("Lv."+str(conquerorlevel))
self.CharacterLevel_3.SetPackedFontColor(0xFFBFD9FF)
else:
self.CharacterLevel_3.SetText("Lv."+str(level))
else:
self.CharacterLevel_3.SetText("Lv."+str(level))
self.DiscFace.Show()
self.Board_Date_1.Hide()
self.Board_Date_2.Hide()
self.Board_Date_3.Hide()
self.Board_Date_4.Show()
self.CharacterFace_3.Show()
if guildName:
self.CharacterGuild_04.SetText(guildName)
else:
self.CharacterGuild_04.SetText(localeworldard.NotGuild)
second = int(playTime * 60) ##Minutos a Segundos
horas = int(second / 3600)
minutos = int((second - (horas * 3600)) / 60)if horas == 0:
self.CharacterTime_04.SetText(str(minutos)+localeworldard.Minutos)
if horas > 0:
self.CharacterTime_04.SetText(str(horas)+localeworldard.Horas+str(minutos)+localeworldard.Minutos)
statesSummary = float(valueHTH + valueINT + valueSTR + valueDEX)
if statesSummary > 0.0:
self.destGauge = [
float(valueHTH) / statesSummary,
float(valueINT) / statesSummary,
float(valueSTR) / statesSummary,
float(valueDEX) / statesSummary
]
else:
self.InitCharacterBoard()def InitCharacterBoard(self):
self.btnStart.Disable()
self.btnStart.Hide()
self.btnDelete.Disable()
self.btnDelete.Hide()
self.btnCreate.Show()
self.btnCreate.Enable()
self.CharacterHTH.SetText("")
self.CharacterINT.SetText("")
self.CharacterSTR.SetText("")
self.CharacterDEX.SetText("")
self.raceName_Text.SetText("")
self.name_shaman.Hide()
self.name_assassin.Hide()
self.name_sura.Hide()
self.name_warrior.Hide()
self.name_wolfman.Hide()
self.DiscFace.Hide()
self.Board_Date_1.Hide()
self.Board_Date_2.Hide()
self.Board_Date_3.Hide()
self.Board_Date_4.Hide()
self.fileListBox.RemoveAllItems()id = self.GetCharacterSlotID(0)
id1 = self.GetCharacterSlotID(1)
id2 = self.GetCharacterSlotID(2)
id3 = self.GetCharacterSlotID(3)
if 0==id:
self.CharacterName_0.SetText("")
self.CharacterLevel_0.SetText("")
self.CharacterFace_0.Hide()
if 0==id1:
self.CharacterName_1.SetText("")
self.CharacterLevel_1.SetText("")
self.CharacterFace_1.Hide()
if 0==id2:
self.CharacterName_2.SetText("")
self.CharacterLevel_2.SetText("")
self.CharacterFace_2.Hide()
if 0==id3:
self.CharacterName_3.SetText("")
self.CharacterLevel_3.SetText("")
self.CharacterFace_3.Hide()
if self.__AreAllSlotEmpty():
self.empireName.SetText("")
self.EmpireImage[1].Hide()
self.EmpireImage[2].Hide()
self.EmpireImage[3].Hide()
## Event
def OnKeyDown(self, key):if 1 == key:
self.ExitSelect()
if 2 == key:
self.SelectSlot(0)
if 3 == key:
self.SelectSlot(1)
if 4 == key:
self.SelectSlot(2)if 28 == key:
id = net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_ID)
if 0 == id:
self.CreateCharacter()else:
self.StartGame()if 203 == key:
self.slot = (self.GetSlotIndex() - 1 + self.SLOT_COUNT) % self.SLOT_COUNT
self.SelectSlot(self.slot)
if 205 == key:
self.slot = (self.GetSlotIndex() + 1) % self.SLOT_COUNT
self.SelectSlot(self.slot)return TRUE
def OnUpdate(self):
chr.Update()for i in xrange(4):
self.curGauge[i] += (self.destGauge[i] - self.curGauge[i]) / 10.0
if abs(self.curGauge[i] - self.destGauge[i]) < 0.005:
self.curGauge[i] = self.destGauge[i]
self.GaugeList[i].SetPercentage(self.curGauge[i], 1.0)for i in xrange(self.SLOT_COUNT):
if FALSE == chr.HasInstance(i):
continuechr.SelectInstance(i)
#######################################################
if -1 != self.startIndex:## Temporary
## BackGroundLoading이 지원 될때까지 임시로..
if app.GetTime() - self.startReservingTime > 3.0:
if FALSE == self.openLoadingFlag:
chrSlot=self.stream.GetCharacterSlot()
net.DirectEnter(chrSlot)
self.openLoadingFlag = TRUEplayTime=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_PLAYTIME)
player.SetPlayTime(playTime)
import chat
chat.Clear() ## 들어갈때 Chat 을 초기화. 임시 Pos.
## Temporary
#######################################################def EmptyFunc(self):
passdef PopupMessage(self, msg, func=0):
if not func:
func=self.EmptyFuncself.stream.popupWindow.Close()
self.stream.popupWindow.Open(msg, func, localeInfo.UI_OK)def OnPressExitKey(self):
self.ExitSelect()
return TRUE- 1
-
M2 Download Center
( Internal )
( GitHub )
Offline Shop - Premium Private Shop System
Hi, due to lack of time, I hadn't shared, but ¡Hey!, I'm here and one more contribution.
The Official Servers have an Offline for few months ago, so I took on the task of making a similar one, It's not like Official Servers in a some parts of code I think, it does occupy designs and other things but in some issues it's different, but I used the rules that they use in terms of encoding.
I hope you like it, I tried that the Offline didn't occupy so many SQL sequences to minimize the load of SQL injections for the server and uses the same methods of the store and stores, don't create new files so that you can observe it.
I take this topic to indicate that I don't sell my things because some persons always end up filtering them and it makes me very lazy to think that, I'm selling and providing kind support to good people so that a bad one arrives and simply ends all that, I don't usually give support because I don't received anything... in Yohara's level system some people sent me a message to indicate that there was an error and it was always an error that they installed it wrong, look correctly at the guide and once for real believe that I omitted something in the guide, you can contact me and tell me to fix it, but if it's an installation error and I must install the system for you, I will charge you, I like to help, but I give you a guide so that it is only corrected what I omitted.If you need me to connect it to your code or to add extra functions, I will still charge you, it's not much, it will simply be at your discretion and it will be a voluntary donation for me and my time, you will value how much you give me, it can be 1 EUR, 2 EUR, 3 EUR, 5 EUR I don't know (So I hope you make an effort, I already gave you the most complicated part, is to copy and paste code already done, including other parts for example like Safebox in Safebox part?), Some people were nice and some were not, so I decided to stop placing the rest of Yohara's patches for a few time.
I hope you like this, install, test and contact me if you detect an error, I already looked for and corrected everything I observed.
About memory leak - Doesn't have, I think .
Use WJ_ENABLE_TRADABLE_ICON (public system).
The default code in Python is Safebox to avoid code differences.
Among other things.
I use TRANSMUTATION like TRANSMUTATION, change it to Changelook, as I indicated in some parts of the guide where to change.# Visual Parts
You can download the patches from the Official Servers in:
Gyazo:
https://metin2.download/picture/7729hcsItciSDcVWd5I9XHHyfljE6o0C/.gif
https://metin2.download/picture/x3I3FDA60ktnOMRrwvHLB17IqsdIifoq/.gifhttps://metin2.download/picture/gw70KzDVtRQ1zzc1utLpBtZNLIn18LZF/.gif
https://metin2.download/picture/8I25DBBiabuxw2cf4W8AZSC5mM0jIM70/.gifGitHub:
- 290
- 3
- 6
- 5
- 5
- 2
- 1
- 7
- 5
- 4
- 2
- 130
- 1
- 24
- 247
-
-
1 hour ago, B4RC0D3 said:
For the EXP, have a look at this: https://de-wiki.metin2.gameforge.com/index.php/Champion_Level
Thanks, i upgraded the code.
- 1
- 1
- 1
- 1
-
2 hours ago, DevBlade said:
How to reach Conqueror? I'm level 120 and I don't get any exp anymore. How can I switch now to Conqueror?
You will need to find yourself in conqueror maps and make a function that replaces "conqueror_level" from 0 to 1.
-
3 hours ago, Kafa said:
First of all this is exactly what i needed. A big thanks to you! If you need help with gathering the informations or other things feel free to contact me. May the dragon god bless you my friend
Thanks
-
M2 Download Center
( Internal )
( GitHub )
This is the Level System and Point's for Yohara
1. The maps are empty, in essence it's the system, (without mobs).
2. If you want to add the monsters on the maps you can contact me and, I add the monsters and put your credits, the truth was I was lazy :'(.
3. I can upload updates if you need it.
4. In essence if you are level 1 or higher, you become "Conqueror", otherwise you are a normal player, your job is simply to add that after Hydra, though, I'll add it later.
5. At the moment it calls the normal experience table, since I have not reviewed the officer's experience tables, but if you indicate the tables, I can modify the code and add that part.
Images:
In GitHub REAMDE.
Link:
You will need a some visual parts, you can with:
I will continue making updates with information by Official Servers .
The system is working properly.- 380
- 2
- 8
- 8
- 4
- 1
- 3
- 4
- 3
- 6
- 4
- 1
- 105
- 1
- 28
- 225
-
1 minute ago, Mafuyu said:
whats about this, i dont have lycan, which one i have to use? can i simple use the define from you?
//Replace with #ifdef ENABLE_CONQUEROR_LEVEL const DWORD SKILL_NUM = 184; #else #ifdef ENABLE_WOLFMAN_CHARACTER const DWORD SKILL_NUM = 176; #else const DWORD SKILL_NUM = 158; #endif #endif
or do i have to change something ?
Just paste the code, it doesn't matter if you have WOLFMAN or not.
- 1
-
12 minutes ago, Mafuyu said:
make it without the useless lycan part please, you have many mismatches bc of the lycan shit in it... some lines doesnt make sense.
#ifdef ENABLE_CONQUEROR_LEVEL #ifdef ENABLE_WOLFMAN_CHARACTER if (GetSkillMasterType(dwSkillVnum) != SKILL_MASTER && (dwSkillVnum >= SKILL_FINISH && dwSkillVnum <= SKILL_ILIPUNGU)) #else if (GetSkillMasterType(dwSkillVnum) != SKILL_MASTER && (dwSkillVnum >= SKILL_FINISH && dwSkillVnum <= SKILL_CHEONUN)) #endif
#ifdef ENABLE_CONQUEROR_LEVEL #ifdef ENABLE_WOLFMAN_CHARACTER if (GetSkillMasterType(pkSk->dwVnum) != SKILL_MASTER && (pkSk->dwVnum<= SKILL_FINISH | pkSk->dwVnum>= SKILL_ILIPUNGU)) #else if (GetSkillMasterType(pkSk->dwVnum) != SKILL_MASTER && (pkSk->dwVnum<= SKILL_FINISH | pkSk->dwVnum>= SKILL_ILIPUNGU)) #endif
why is above SKILL_ILIPUNGU and another skill, next code part is the same line??
1. If you don't like it, remove it and that's it, I only saved the work for those who have defined WOLFMAN or not. If you don't have WOLFMAN, it doesn't mean that the rest don't either, I do have WOLFMAN. I repeat, if you don't like the lines I don't care, remove it and that's it. I just gave you something that someone else would have sold you dearly
2. My bad i have already corrected that fragment, thank you, shoul de SKILL_CHEONUN. Thanks- 2
-
8 minutes ago, Kuroko said:
Good evening, I have this problem with the 9th skill, so I don't know if the problem comes from me or if this problem is already present and for the Lycan the skill is not available.
https://metin2.download/picture/2iLLqgb7UxKE3O1XvFgQuu9oCyjJIoNj/.gif
In skill_proto.sql remove DISABLE_BY_POINT_UP for all skills, What happens is that I placed it as in Official Servers and in Official Servers it is uploaded with their respective books, not with points.
- 1
- 1
- 1
- 2
-
UPDATE:
Now all it's right.
POINT_INVINCIBLE removed.
Archives:
char.cpp
char.h
char_skill.cpp
cmd_general.cpp
constants.cppCheck the dates for all changed files, i change a some functions.
I uploaded files for metin2_patch_yohara.The problem with Pasive Skills corrected, Special Thanks for @WLsj24.
- 5
-
M2 Download Center
( Internal )
( GitHub )
I have added some necessary visual stuff, although some are just visual.
I don't provide basic support for implementation, If you notice that something is missing you can let me know and I will add it.- 135
- 2
- 3
- 2
- 1
- 2
- 26
- 7
- 75
-
It's very simple, I suppose some must already have FIX but most do not.
When you give Guild War Under Map if an Observer from your guild enters War and the enemy kills it, the counter will count it causing you to lose the war if they are many observers., although it can only kill you once, it continues to be an advantage.
Search in battle.cpp
bool battle_is_attackable(LPCHARACTER ch, LPCHARACTER victim) { if (victim->IsDead()) return false;
after this add:
if (victim->IsObserverMode()) return false;
Now its fixed.
- 1
- 4
-
I can't figure out what this fixes, you keep putting pseudo-random numbers on your fix .
If it's a function to reset new "nice", but I think what you want is to eliminate the fact that some characters are reset and change the values with some in 10k and others in 13k even if they are of the same race.The problem is that since you create the character for the first time Metin2 will always place one stronger than another regardless of whether they are of the same race, that is to say that a character will always be lucky among 5 others to be the winner with more attributes "Forcing forced reset to stabilize." .
You have two options more eaasy:- Remove all RANDOM functions or MINMAX and set your conditions, but you are going to change all the ones that contain the array or data structure and this is very boring.
- Go to constants.cpp and replace the "Global Data Structure":
TJobInitialPoints JobInitialPoints[JOB_MAX_NUM] = /* { int st, ht, dx, iq; int max_hp, max_sp; int hp_per_ht, sp_per_iq; int hp_per_lv_begin, hp_per_lv_end; int sp_per_lv_begin, sp_per_lv_end; int max_stamina; int stamina_per_con; int stamina_per_lv_begin, stamina_per_lv_end; } */ { // str con dex int 초기HP 초기SP CON/HP INT/SP HP랜덤/lv MP랜덤/lv 초기stam stam/con stam/lv { 6, 4, 3, 3, 600, 200, 40, 20, 36, 44, 18, 22, 800, 5, 1, 3 }, // JOB_WARRIOR 16 { 4, 3, 6, 3, 650, 200, 40, 20, 36, 44, 18, 22, 800, 5, 1, 3 }, // JOB_ASSASSIN 16 { 5, 3, 3, 5, 650, 200, 40, 20, 36, 44, 18, 22, 800, 5, 1, 3 }, // JOB_SURA 16 { 3, 4, 3, 6, 700, 200, 40, 20, 36, 44, 18, 22, 800, 5, 1, 3 }, // JOB_SHAMANa 16 #ifdef ENABLE_WOLFMAN_CHARACTER { 2, 6, 6, 2, 600, 200, 40, 20, 36, 44, 18, 22, 800, 5, 1, 3 }, // JOB_WOLFMAN 16 // TODO: 4개능력치 초기값 외에 다른 스탯 필요 (기획자한테 요청) #endif };
for:
TJobInitialPoints JobInitialPoints[JOB_MAX_NUM] = /* { int st, ht, dx, iq; int max_hp, max_sp; int hp_per_ht, sp_per_iq; int hp_per_lv_begin, hp_per_lv_end; int sp_per_lv_begin, sp_per_lv_end; int max_stamina; int stamina_per_con; int stamina_per_lv_begin, stamina_per_lv_end; } */ { // str con dex int 초기HP 초기SP CON/HP INT/SP HP랜덤/lv MP랜덤/lv 초기stam stam/con stam/lv { 6, 4, 3, 3, 600, 200, 40, 20, 44, 44, 22, 22, 800, 5, 3, 3 }, // JOB_WARRIOR 16 { 4, 3, 6, 3, 650, 200, 40, 20, 44, 44, 22, 22, 800, 5, 3, 3 }, // JOB_ASSASSIN 16 { 5, 3, 3, 5, 650, 200, 40, 20, 44, 44, 22, 22, 800, 5, 3, 3 }, // JOB_SURA 16 { 3, 4, 3, 6, 700, 200, 40, 20, 44, 44, 22, 22, 800, 5, 3, 3 }, // JOB_SHAMANa 16 #ifdef ENABLE_WOLFMAN_CHARACTER { 2, 6, 6, 2, 600, 200, 40, 20, 44, 44, 22, 22, 800, 5, 3, 3 }, // JOB_WOLFMAN 16 // TODO: 4개능력치 초기값 외에 다른 스탯 필요 (기획자한테 요청) #endif };
That's it.
- 3
-
53 minutes ago, Narvikz said:
Yea ok. I will not be discussing this with you, but my fault for dropping it in without any context anyway. ReactOS reached Windows Server 2003 compatibility, then the project was halted due to loss of interest. Anyone who can understand it sees the point has been proven and that kernel integrity checks were not really needed for ReactOS, nor would it make sense enforce its own root authority chain of trust nor Microsoft's in their own research OS.
I really hope you're not Frankie. I never seen martysama thread but I remember how annoying that guy was over skype asking for information like he actually needed that money to be partying or something. I am not surprised by the turn of events.
bad joke
bad
That is a correct answer, you should also contemplate that the loss of interest was due to a series of demands, as I told you, Windows files were leaked, which ReactOS occupied, it's different to Reverse Engineering, there are many projects with compatibility for Windows programs such as the Samba project.
Don't worry, I don't like Frankie's useless one, years ago just because he thought he was a developer, he kicked me out of a series of groups.
But as I see that many think that I am the trash person, my GeoIP
https://metin2.download/picture/yeg3hcO7e2OGKR817deBykl3q6Di5Mt2/.pngI think that before I start to defame, first inquire, don't compare me with that garbage that just copies and paste code.- 2
SungmaHee Tower Official Servers (C++, Python)
in Features & Metin2 Systems
Posted
I apologize to the guys above if I took the comments too personally, I was a little tired from the amount of messages I received that day, it wasn't good and I understand that I may have had a logic error in the code. I honestly hadn't looked at it before months and as I mentioned I was a little tired. But I suppose that more than one person will find what I shared useful to complete their Yohara.
Regarding the contribution, if anyone gives me information about the floors of the tower I can finish it without any problem, correct the errors that were mentioned to me in the forum and share it. I have no problem with the tower being complete.
I was not in the mood.
I'm going to steal your way of replying.
I am going to respond to you because you told me things that made me cry...
Do you know the difference between doing what @ martysama0134 or @ Amun did and what they did? They came with everything,
And about humility, maybe I don't have it, but it's horrible that I came with the best intentions to share and they only attacked when I myself indicated that it wasn't finished and that they could finish it without any problem. Just take the important parts and delete the bad parts, it's not that hard.
And about the coroutines, I don't think it's right that you're trying to tell me that I don't know such basic programming concepts, I can ask about encapsulation, polymorphism or overloading and I'm sure that with at least one you will search what I'm talking about.
I have already received corrections before and I receive them with kindness as long as they are corrections and not attacks because they want everything for free and in many cases they do not have basic programming concepts.
No developer is exempt from making code errors, "many around here should understand", it is a human quality and that is why concepts such as Software development lifecycle (SDLC) have been introduced. I have them, you have them, we all have them and the larger the code, the greater the number of errors. For this reason, there are techniques to reduce the number of code errors.
It just happened, just as this time I had a logic error that I honestly didn't review, I have had many other contributions in this forum that I suppose many have used. So don't talk to me about humility when I'm only trying to collaborate and the only thing I receive is two or three people with problems and they don't provide arguments with a code correction that I don't mind receiving.
NOTE: I don't believe I'm superior to people, but it is always better to say that something can be optimized and provide feedback than to come and attack with new accounts and have others take things personally.
I was not in the mood.
Thank you . I'm going to review the issue of repeated code and the rest that you told me, you're right.