Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 02/07/21 in all areas

  1. Pirates .:: weapons .:: sash .:: pets .:: mount
    3 points
  2. M2 Download Center Download Here ( Internal ) Other Download Link
    2 points
  3. There instructions have been tested on FreeBSD 12.1! First of all we want to install update the package repository: pkg update If you have never used pkg probably you will be asked to install it. Now run this command to install php7.4 and nginx pkg install php74 nginx We can install the most common php extensions running this command: pkg install php74-extensions php74-mysqli php74-mbstring php74-curl php74-gd The following extensions will be installed: php74-ctype: 7.4.14 php74-curl: 7.4.14 php74-dom: 7.4.14 php74-extensions: 1.0 php74-filter: 7.4.14 php74-gd: 7.4.14 php74-iconv: 7.4.14 php74-json: 7.4.14 php74-mbstring: 7.4.14 php74-mysqli: 7.4.14 php74-opcache: 7.4.14 php74-pdo: 7.4.14 php74-pdo_sqlite: 7.4.14 php74-phar: 7.4.14 php74-posix: 7.4.14 php74-session: 7.4.14 php74-simplexml: 7.4.14 php74-sqlite3: 7.4.14 php74-tokenizer: 7.4.14 php74-xml: 7.4.14 php74-xmlreader: 7.4.14 php74-xmlwriter: 7.4.14 Enable nginx and php service to automatically start sysrc nginx_enable=yes sysrc php_fpm_enable=YES We can start nginx and php for the first time by running service nginx start service php-fpm start You can open now your web browser and type the server ip in the address bar. You should see a page like this We are going to configure nginx now. Open the file nginx.conf located in /usr/local/etc/nginx and modify the section "server": server { listen 80; server_name _; root /var/www; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } location ~ /\.ht { deny all; } } Change mydomainname.com with your domain (or server ip). We can test now if php is working correctly. The files of your webiste will be hosted in the folder /var/www (you can change it in the configuration above). Create a new file inside that folder and call it index.php with this content: <?php phpinfo(); Now open again the browser and type the ip address/domain name and you should see something like this: The server is working properly and you can upload now your script You might need to install more php extentions according to the requirements of your script
    2 points
  4. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) I would not recommend using this as it's missing many features, head over to Mali's release for an updated version. [Hidden Content]
    2 points
  5. For anyone who wants to reload 'shopex' & 'shopex_item' using /reload p (works on the db/mysql version only) 1. You must have this 2. game/src input_db.cpp 3. db/src ClientManager.cpp And that's it Proof
    2 points
  6. M2 Download Center Download Here ( Internal ) Hello. Today I'd like to share this little stuff what I reversed from the official binary a month ago. This will fix the positions of textails(name position changes by every update packet on the main character), and also the position of the emotions when you are on a mount . I've made a little demonstration video where you can see a private server without the fix, my fixxed version and the official aswell. 1. Client/bin/playersettingmodule.py 2. Client/bin/introLoading.py 3. Place the race_height.txt from the official client into the yours and pack it in the root. 4. Client/UserInterface/PythonCharacterManagerModule.cpp 5. Client/GameLib/RaceManager.h 6. Client/GameLib/RaceManager.cpp 7. Client/UserInterface/InstanceBase.h 8. Client/UserInterface/InstanceBase.cpp 9. Client/UserInterface/InstanceBaseEffect.cpp 10. Client/UserInterface/PythonTextTail.cpp 11. Client/GameLib/ActorInstance.cpp I hope you like it, and if you find any problem just let me know in this topic.
    1 point
  7. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Anyway now you can sell shop items with sockets and attrs at shopex. New price types. New sorting options Every Item can have different price type. price_type: 1:Gold 2:Second Coin 3:Item 4:EXP sort: Asc,Desc,Vnum,Price,Name,Type
    1 point
  8. When you reset your skill group more then once in a row, you will get this weird bug when you cant see the real skill level + cant use the skills until you relog. With this fix you dont need to relog anymore. Video explaining the bug: [Hidden Content] To fix that, we need to change just 1 line - in file ClientSRC/UserInterface/PythonNetworkStreamPhaseGame.cpp in the function bool CPythonNetworkStream::RecvChangeSkillGroupPacket() change the line CPythonPlayer::Instance().NEW_ClearSkillData(); to CPythonPlayer::Instance().NEW_ClearSkillData(true); This bug happened because old skill data were not removed from m_skillSlotDict. With passing parameter "true" to function NEW_ClearSkillData, everything (including old bugged skill data) will be removed from m_skillSlotDict. Then function RefreshCharacter from uiCharacter.py will automatically insert correct data to the m_skillSlotDict.
    1 point
  9. Required level : Beginner Estimated time : 20 min Hello everyone ! Needed : Have a Metin2 server with WinSCP access to your server. A tool to unpack your client like EterManager, Eternexus, or EterPack Archiver A TGA file for the item icon. You can also use an existing one. If you implement an item with a 3D Model (weapon, armor, costume, etc ..), you'll need : A file .gr2 which corresponds to the 3D model of your item and the tool Granny Viewer which allows you to view this type of model. One or multiple .dds / .tga files which correspond to the textures of the item. I. Client Side : II. Server Side : A category Questions and Answers is available. If you have a problem or a question, feel free to post a request!
    1 point
  10. M2 Download Center Download Here ( Internal ) Dear community, this is my first guide for you in which I will show you how you change the older Granny 2.4 version which is the client using to the newer Granny 2.9 version. For this tutorial I'm using the mainline_released client source (all client sources are the same as I heard). DO NOT FORGET TO CREATE BACKUPS! 1. Step: Navigate to novalineSrcsToolsRAD Game Toolsgrannycommon and unzip the file granny_common_2_9_12_0_release.zip. You will receive some folders. Now you navigate into the folder include and copy the granny.h file to the include folder of your client (for me it's mainline_releasedSrcsExterninclude). Then you go into the libwin32 folder and copy all the *.lib and *.pdb files into your lib folder of your client. 2. Step: Open your client source and navigate to the project EterGrnLib. Open Mesh.cpp. Search for this: int * boneIndices = GrannyGetMeshBindingToBoneIndices(pgrnMeshBinding); Replace with this: int * boneIndices = (int*)GrannyGetMeshBindingToBoneIndices(pgrnMeshBinding); Search for this: return GrannyGetMeshBindingToBoneIndices(m_pgrnMeshBindingTemp); Replace with this: return (int*)GrannyGetMeshBindingToBoneIndices(m_pgrnMeshBindingTemp); Search for this: m_pgrnMeshDeformer = GrannyNewMeshDeformer(pgrnInputType, pgrnOutputType, GrannyDeformPositionNormal); Replace with this: m_pgrnMeshDeformer = GrannyNewMeshDeformer(pgrnInputType, pgrnOutputType, GrannyDeformPositionNormal, GrannyAllowUncopiedTail); ----- Open ModelInstanceUpdate.cpp. Search for this: GrannyUpdateModelMatrix(m_pgrnModelInstance, fSecondsElapsed, (const float *) pMatrix, (float *) pMatrix); Replace with this: GrannyUpdateModelMatrix(m_pgrnModelInstance, fSecondsElapsed, (const float *) pMatrix, (float *) pMatrix, false); ----- Open Material.cpp. Search for this: granny_variant twoSideResult = GrannyFindMatchingMember(pgrnMaterial->ExtendedData.Type, pgrnMaterial->ExtendedData.Object, "Two-sided"); if (NULL != twoSideResult.Type) GrannyConvertSingleObject(twoSideResult.Type, twoSideResult.Object, TwoSidedFieldType, &twoSided); Replace with this: granny_variant twoSideResult; if (GrannyFindMatchingMember(pgrnMaterial->ExtendedData.Type, pgrnMaterial->ExtendedData.Object, "Two-sided", &twoSideResult) && NULL != twoSideResult.Type) GrannyConvertSingleObject(twoSideResult.Type, twoSideResult.Object, TwoSidedFieldType, &twoSided, NULL); ----- Open ModelInstanceModel.cpp Search for this: return GrannyGetMeshBindingToBoneIndices(m_vct_pgrnMeshBinding[iMeshBinding]); Replace with this: return (int*)GrannyGetMeshBindingToBoneIndices(m_vct_pgrnMeshBinding[iMeshBinding]); ----- Navigate to the UserInterface project. Open UserInterface.cpp. Search for this (it's at the end of the file): static void GrannyError(granny_log_message_type Type, granny_log_message_origin Origin, char const *Error, void *UserData) { TraceError("GRANNY: %s", Error); } Replace with this: static void GrannyError(granny_log_message_type Type, granny_log_message_origin Origin, char const* File, granny_int32x Line, char const *Error, void *UserData) { TraceError("GRANNY: %s", Error); } Now rebuild the whole project! 3. Step: Go to the folder where we unziped the things of the first step and go to the lib folder. Copy the granny2.dll into your main client directory. Now you're finished and you have Granny 2.9. I hope this guide helped you! Special Thanks to Cryfact! Regards
    1 point
  11. Costume bonuses are taken from item_attr table but this is quite a limit. We are going to create a second table item_attr_costume which will contain only costume bonuses. Transform costume and Enchant costume will take bonus from the new table item_attr_costume. Let's start. Open ClientManagerBoot.cpp and add at the end bool CClientManager::InitializeCostumeAttrTable() { char query[4096]; snprintf(query, sizeof(query), "SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr_costume%s ORDER BY apply", GetTablePostfix()); std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query)); SQLResult* pRes = pkMsg->Get(); if (!pRes->uiNumRows) { sys_err("no result from item_attr_costume"); return false; } if (!m_vec_costumeAttrTable.empty()) { sys_log(0, "RELOAD: item_attr_costume"); m_vec_costumeAttrTable.clear(); } m_vec_costumeAttrTable.reserve(pRes->uiNumRows); MYSQL_ROW data; while ((data = mysql_fetch_row(pRes->pSQLResult))) { TItemAttrTable t{}; int col = 0; strlcpy(t.szApply, data[col++], sizeof(t.szApply)); str_to_number(t.dwApplyIndex, data[col++]); str_to_number(t.dwProb, data[col++]); str_to_number(t.lValues[0], data[col++]); str_to_number(t.lValues[1], data[col++]); str_to_number(t.lValues[2], data[col++]); str_to_number(t.lValues[3], data[col++]); str_to_number(t.lValues[4], data[col++]); str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]); str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]); str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]); str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]); str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]); str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]); str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]); str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]); m_vec_costumeAttrTable.push_back(t); } return true; } Search if (!InitializeItemRareTable()) { sys_err("InitializeItemRareTable FAILED"); return false; } add under if (!InitializeCostumeAttrTable()) { sys_err("InitializeCostumeAttrTable FAILED"); return false; } open ClientManager.h and look for bool InitializeMonarch(); add under bool InitializeCostumeAttrTable(); look for std::vector<TItemAttrTable> m_vec_itemRareTable; add under std::vector<TItemAttrTable> m_vec_costumeAttrTable; open ClientManager.cpp and look for tmp->EncodeWORD(m_vec_itemRareTable.size()); tmp->Encode(&m_vec_itemRareTable[0], sizeof(TItemAttrTable) * m_vec_itemRareTable.size()); add under tmp->EncodeWORD(m_vec_costumeAttrTable.size()); tmp->Encode(&m_vec_costumeAttrTable[0], sizeof(TItemAttrTable) * m_vec_costumeAttrTable.size()); look for sizeof(WORD) + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_itemRareTable.size() + add under sizeof(WORD) + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_costumeAttrTable.size() + look for tmp->EncodeHeader(HEADER_DG_RELOAD_PROTO, 0, sizeof(WORD) + sizeof(TSkillTable) * m_vec_skillTable.size() + sizeof(WORD) + sizeof(TBanwordTable) * m_vec_banwordTable.size() + sizeof(WORD) + sizeof(TItemTable) * m_vec_itemTable.size() + sizeof(WORD) + sizeof(TMobTable) * m_vec_mobTable.size() + sizeof(WORD) + sizeof(TShopTable) * m_iShopTableSize + sizeof(WORD) + sizeof(TRefineTable) * m_iRefineTableSize + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_itemAttrTable.size() + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_itemRareTable.size(); and change it like this tmp->EncodeHeader(HEADER_DG_RELOAD_PROTO, 0, sizeof(WORD) + sizeof(TSkillTable) * m_vec_skillTable.size() + sizeof(WORD) + sizeof(TBanwordTable) * m_vec_banwordTable.size() + sizeof(WORD) + sizeof(TItemTable) * m_vec_itemTable.size() + sizeof(WORD) + sizeof(TMobTable) * m_vec_mobTable.size() + sizeof(WORD) + sizeof(TShopTable) * m_iShopTableSize + sizeof(WORD) + sizeof(TRefineTable) * m_iRefineTableSize + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_itemAttrTable.size() + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_itemRareTable.size() + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_costumeAttrTable.size()); look for peer->EncodeWORD(sizeof(TItemAttrTable)); peer->EncodeWORD(m_vec_itemRareTable.size()); peer->Encode(&m_vec_itemRareTable[0], sizeof(TItemAttrTable) * m_vec_itemRareTable.size()); add under peer->EncodeWORD(sizeof(TItemAttrTable)); peer->EncodeWORD(m_vec_costumeAttrTable.size()); peer->Encode(&m_vec_costumeAttrTable[0], sizeof(TItemAttrTable) * m_vec_costumeAttrTable.size()); open constants.cpp and look for TItemAttrMap g_map_itemRare; add under TItemAttrMap g_map_itemAttrCostume; open constants.h and look for extern TItemAttrMap g_map_itemRare; add under extern TItemAttrMap g_map_itemAttrCostume; open input_db.cpp and look for /* * ITEM RARE */ if (decode_2bytes(data) != sizeof(TItemAttrTable)) { sys_err("item rare table size error"); thecore_shutdown(); return; } data += 2; size = decode_2bytes(data); data += 2; sys_log(0, "BOOT: ITEM_RARE: %d", size); if (size) { TItemAttrTable * p = (TItemAttrTable *) data; for (int i = 0; i < size; ++i, ++p) { if (p->dwApplyIndex >= MAX_APPLY_NUM) continue; g_map_itemRare[p->dwApplyIndex] = *p; sys_log(0, "ITEM_RARE[%d]: %s %u", p->dwApplyIndex, p->szApply, p->dwProb); } } data += size * sizeof(TItemAttrTable); add under /* * ITEM ATTR COSTUME */ if (decode_2bytes(data) != sizeof(TItemAttrTable)) { sys_err("item attr costume table size error"); thecore_shutdown(); return; } data += 2; size = decode_2bytes(data); data += 2; sys_log(0, "BOOT: ITEM_ATTR_COSTUME: %d", size); if (size) { TItemAttrTable* p = (TItemAttrTable*)data; for (int i = 0; i < size; ++i, ++p) { if (p->dwApplyIndex >= MAX_APPLY_NUM) continue; g_map_itemAttrCostume[p->dwApplyIndex] = *p; sys_log(0, "ITEM_ATTR_COSTUME[%d]: %s %u", p->dwApplyIndex, p->szApply, p->dwProb); } } data += size * sizeof(TItemAttrTable); open item_attribute.cpp and add these functions at the end (I don't remember why I rewrote this part, just replace your functions if you already have them) bool CItem::AddCostumeAttribute() { int count = GetAttributeCount(); if (count >= COSTUME_ATTRIBUTE_MAX_LEVEL) return false; int pos = count; TPlayerItemAttribute& attr = m_aAttr[pos]; int nAttrSet = GetAttributeSetIndex(); std::vector<int> avail; for (int i = 0; i < MAX_APPLY_NUM; ++i) { const TItemAttrTable& r = g_map_itemAttrCostume[i]; if (r.dwApplyIndex != 0 && r.bMaxLevelBySet[nAttrSet] > 0 && HasAttr(i) != true) { avail.push_back(i); } } if (avail.size() == 0) { return false; } const TItemAttrTable& r = g_map_itemAttrCostume[avail[number(0, avail.size() - 1)]]; int nAttrLevel = number(1, 5); if (nAttrLevel > r.bMaxLevelBySet[nAttrSet]) nAttrLevel = r.bMaxLevelBySet[nAttrSet]; attr.bType = r.dwApplyIndex; attr.sValue = r.lValues[nAttrLevel - 1]; UpdatePacket(); Save(); return true; } bool CItem::AddRandomNumberOfCostumeAttributes() { int cnt = GetAttributeCount(); int new_bonus_cnt = number(1, 3); for (int i = 0; i < cnt; ++i) { m_aAttr[i].bType = 0; m_aAttr[i].sValue = 0; } for (int i = 0; i < new_bonus_cnt ; ++i) { AddCostumeAttribute(); } return true; } bool CItem::ChangeCostumeAttribute() { int cnt = GetAttributeCount(); for (int i = 0; i < cnt; ++i) { m_aAttr[i].bType = 0; m_aAttr[i].sValue = 0; } for (int i = 0; i < cnt; ++i) { AddCostumeAttribute(); } return true; } open item_length.h and look for ITEM_ATTRIBUTE_MAX_LEVEL = 5, add under COSTUME_ATTRIBUTE_MAX_LEVEL = 5, open item.h and look for int GetRareAttrCount(); bool AddRareAttribute(); add under bool AddCostumeAttribute(); bool ChangeCostumeAttribute(); bool AddRandomNumberOfCostumeAttributes(); open char_item.cpp and look for switch (item->GetSubType()) { case USE_CHANGE_COSTUME_ATTR: item2->ChangeAttribute(); { char buf[21]; snprintf(buf, sizeof(buf), "%u", item2->GetID()); LogManager::instance().ItemLog(this, item, "CHANGE_COSTUME_ATTR", buf); } break; case USE_RESET_COSTUME_ATTR: item2->ClearAttribute(); item2->AlterToMagicItem(); { char buf[21]; snprintf(buf, sizeof(buf), "%u", item2->GetID()); LogManager::instance().ItemLog(this, item, "RESET_COSTUME_ATTR", buf); } break; } ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼Ó¼ºÀ» º¯°æÇÏ¿´½À´Ï´Ù.")); item->SetCount(item->GetCount() - 1); break; replace with if (item->GetSubType() == USE_RESET_COSTUME_ATTR) { if (item2->GetAttributeCount() < 3) { if (item2->AddCostumeAttribute()) { item->SetCount(item->GetCount() - 1); } } } else { if (item2->GetAttributeCount() == 0) { ChatPacket(CHAT_TYPE_INFO, "You must add some bonuses first."); return false; } if (item2->ChangeCostumeAttribute()) { item->SetCount(item->GetCount() - 1); } } break; run this query in your database player: DROP TABLE IF EXISTS `item_attr_costume`; CREATE TABLE `item_attr_costume` ( `apply` enum('MAX_HP','MAX_SP','CON','INT','STR','DEX','ATT_SPEED','MOV_SPEED','CAST_SPEED','HP_REGEN','SP_REGEN','POISON_PCT','STUN_PCT','SLOW_PCT','CRITICAL_PCT','PENETRATE_PCT','ATTBONUS_HUMAN','ATTBONUS_ANIMAL','ATTBONUS_ORC','ATTBONUS_MILGYO','ATTBONUS_UNDEAD','ATTBONUS_DEVIL','STEAL_HP','STEAL_SP','MANA_BURN_PCT','DAMAGE_SP_RECOVER','BLOCK','DODGE','RESIST_SWORD','RESIST_TWOHAND','RESIST_DAGGER','RESIST_BELL','RESIST_FAN','RESIST_BOW','RESIST_FIRE','RESIST_ELEC','RESIST_MAGIC','RESIST_WIND','REFLECT_MELEE','REFLECT_CURSE','POISON_REDUCE','KILL_SP_RECOVER','EXP_DOUBLE_BONUS','GOLD_DOUBLE_BONUS','ITEM_DROP_BONUS','POTION_BONUS','KILL_HP_RECOVER','IMMUNE_STUN','IMMUNE_SLOW','IMMUNE_FALL','SKILL','BOW_DISTANCE','ATT_GRADE_BONUS','DEF_GRADE_BONUS','MAGIC_ATT_GRADE_BONUS','MAGIC_DEF_GRADE_BONUS','CURSE_PCT','MAX_STAMINA','ATT_BONUS_TO_WARRIOR','ATT_BONUS_TO_ASSASSIN','ATT_BONUS_TO_SURA','ATT_BONUS_TO_SHAMAN','ATT_BONUS_TO_MONSTER','ATT_BONUS','MALL_DEFBONUS','MALL_EXPBONUS','MALL_ITEMBONUS','MALL_GOLDBONUS','MAX_HP_PCT','MAX_SP_PCT','SKILL_DAMAGE_BONUS','NORMAL_HIT_DAMAGE_BONUS','SKILL_DEFEND_BONUS','NORMAL_HIT_DEFEND_BONUS','PC_BANG_EXP_BONUS','PC_BANG_DROP_BONUS','EXTRACT_HP_PCT','RESIST_WARRIOR','RESIST_ASSASSIN','RESIST_SURA','RESIST_SHAMAN','ENERGY','DEF_GRADE','COSTUME_ATTR_BONUS','MAGIC_ATT_BONUS_PER','MELEE_MAGIC_ATT_BONUS_PER','RESIST_ICE','RESIST_EARTH','RESIST_DARK','RESIST_CRITICAL','RESIST_PENETRATE','BLEEDING_REDUCE','BLEEDING_PCT','ATT_BONUS_TO_WOLFMAN','RESIST_WOLFMAN','RESIST_CLAW') NOT NULL DEFAULT 'MAX_HP', `prob` int unsigned NOT NULL DEFAULT '0', `lv1` int unsigned NOT NULL DEFAULT '0', `lv2` int unsigned NOT NULL DEFAULT '0', `lv3` int unsigned NOT NULL DEFAULT '0', `lv4` int unsigned NOT NULL DEFAULT '0', `lv5` int unsigned NOT NULL DEFAULT '0', `weapon` int unsigned NOT NULL DEFAULT '0', `body` int unsigned NOT NULL DEFAULT '0', `wrist` int unsigned NOT NULL DEFAULT '0', `foots` int unsigned NOT NULL DEFAULT '0', `neck` int unsigned NOT NULL DEFAULT '0', `head` int unsigned NOT NULL DEFAULT '0', `shield` int unsigned NOT NULL DEFAULT '0', `ear` int unsigned NOT NULL DEFAULT '0', `costume_body` int unsigned NOT NULL DEFAULT '0', `costume_hair` int unsigned NOT NULL DEFAULT '0', `costume_weapon` int unsigned NOT NULL DEFAULT '0' ) ENGINE=MyISAM DEFAULT CHARSET=latin1; SET FOREIGN_KEY_CHECKS=1; and you can add bonuses you want for costumes in it that's it
    1 point
  12. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Python-Code-Translator-2-to-3 Is a Python program that reads Python 2.x source code and applies a series of fixers to transform it into valid Python 3.x code that works on all versions (py2.x - py3.x). The standard library contains a rich set of fixers that will handle almost all code. A flexible and generic library, so it is possible to write your own fixers based on your purposes. Warning: This tool purpose wasn't for doing the transition to python3, is just for the IDE purpose. INSTALLATION [Hidden Content] USING Add your .py scripts to the modules folder. Run main.bat Take the output files and move them into your application. FIXERS print Converts the print statement to the print() function. Matching multiple formats, comments, and more. Exception handling Convert except to except BaseException, since BaseException is the base class for all built-in exceptions. Converts except X, T to except X as T. xrange Renames xrange() to range() and wraps existing range() calls with list. has_key Changed dict.has_key(key) to dict..contains__(key) dict Fixes dictionary iteration methods. dict.iteritems() is converted to dict.items(), dict.iterkeys() to dict.keys(), and dict.itervalues() to dict.values(). Similarly, dict.viewitems(), dict.viewkeys() and dict.viewvalues() are converted respectively to dict.items(), dict.keys() and dict.values(). It also wraps existing usages of dict.items(), dict.keys(), and dict.values() in a call to list. exec - TODO Converts the exec statement to the exec() function. apply - TODO Removes usage of apply(). For example apply(function, *args, **kwargs) is converted to function(*args, **kwargs). raise - TODO Converts raise E, V to raise E(V), and raise E, V, T to raise E(V).with_traceback(T). If E is a tuple, the translation will be incorrect because substituting tuples for exceptions has been removed in 3.0. You can use it together with Skeleton of Python modules for IDE, from @Takuma. Download: [hide][Hidden Content]]
    1 point
  13. #Updated use shop.vnum
    1 point
  14. .:: animated_weapons .:: mounts .:: pets .:: sash
    1 point
  15. 1 point
  16. void CHARACTER::ComputePoints()
    1 point
  17. Excellent tutorial! I would add just one little thing (I'm sure its not there, but if I'm blind or something, pardon me). GR2 and gr2 problem. It's always important to check if models has extension in lower cases letters. Otherwise client won't read the models. Some packers do it automatically, but some of them not.
    1 point
  18. Icon for hiding costumes (the eye is from photoshop xd). Maybe it will be useful to someone. Download: https://mega.nz/file/rw0kxB7K#nHrPkfJpQHfH6BaLCabqzctRx5kDCKKALItnKfvOkKk
    1 point
  19. Python version. Work in both ways. From inventory to safebox and from safebox to inventory. [Hidden Content]
    1 point
  20. M2 Download Center Download Here ( Internal ) Download: [Hidden Content]
    1 point
  21. Lambda expressions (since C++11), you need CFLAG += -std=c++11, if you want to do it without, then you've to do something like this: [Hidden Content]
    1 point
  22. Wikipedia has a API included, you can play with it. [Hidden Content] MediaWiki docs: All Query modules Get properties of pages List pages matching a criterion Get module parameters information Get meta information about the wiki and user Some examples: [Hidden Content] You've to install the requests library first one. pip install requests # Installing collected packages: certifi, chardet, urllib3, idna, requests # Successfully installed certifi-2019.3.9 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.2 How to use: [Hidden Content]
    1 point
  23. M2 Download Center Download Here ( Internal ) Hi, DirectX 8 -> 9 Python 2.2.15 -> 2.7.6 Granny 2.4.0.30 -> 2.9.12.0 Boost 1.43.0 -> 1.55.0 DevIL 1.6.1 -> 1.7.8 Crypto++ 5.6.1 -> 5.6.2 LZO 2.03 -> 2.06 JPEG Lib 6b -> 9a + fixxed Minimap and 4 Inventory Pages Scan: here Download: here Siencly, Smith
    1 point
  24. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Renewal Version:
    0 points
  25. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) [Hidden Content]
    0 points
  26. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) [Hidden Content]
    0 points
  27. M2 Download Center Download Here ( Internal ) For years now we've relied on various file leaks which were usually in some Asian language, up until 2010 when someone (nico_w?) released the SG database. Even after this date, we continued to use our old file structures and methods, and old bash scripts to manage our servers. In 2013, some files were released which came from a private server that was based off the SG files. This isn't a thread to talk about who's right or wrong, or who did what work or anything like that... just a place to release files. The reason this release is beneficial is we've never really had a full release of "clean" and "untouched" files. Every time someone releases files they have some stupid backdoor added or are heavily modified from the original. The goal of this release is to get the files to be as close as possible to an official server, and remove things like Xtrap which none of us are using anyway. Official files is what all the pservers are based off of, so having the official structure just makes sense. There are several threads online with files that have been modified by some person but I never see threads with the files the way they originally came. These files in the game folder are from July, 2013 and the game/db cores are fully unmodified and straight from YMIR. That includes lack of modification to make them compatible with certain clients or anything like that. Garbage files like old logs are removed and ready to be generated when you launch your server. These are meant to be a "base server" for the one you want to create. For this reason, there are no customized quests or new items and stuff like that. It's only what SG had in 2013 of July. The database structure is the one from this thread: [Hidden Content] The item_proto and mob_proto is the one from SG in July 2013. I've included a tool in the download as well used to dump the server proto to the client. Since the goal is purity of files, but some files had to be slightly modified for simplicity (and so they run at all) here's the list of things changed/removed: - Removed panama folder. - Removed old log files and pid files, etc.. - Removed Xcrap stuff - Removed all traces to the above (Symlinks) from install.sh. - Removed cshybridcrypt files. - Modified CONFIG file to guide you into configuration for your own usage. - The quests are from the leak of pserver files based off SG. Some of these may or may not work fully. - Timebomb fix applied (Updated: March 13th, 2014) Now in order to use these files: 1. Upload and untar the database and server files. "untouched_34083_db.tar.gz" goes in "/var/db". 2. Navigate with PuTTy to the game folder as a root user and run this command: "chown -R metin2 .". 3. Navigate to the game folder as the metin2 user and run install.sh. This will setup all the permissions and symlinks correctly. 4. Restart your database with the command "service mysql-server restart". The server can be started and stopped by executing "run.sh" and "shutdown.sh" and logs can be cleared by executing "clear.sh". All of these are found in the game folder. Make sure to "/shutdown" ingame before using "shutdown.sh" or you may have data loss. Don't be alarmed when running the shutdown script, it's normal for PuTTy to not give you a prompt for a while (you haven't disconnected from SSH). How to convert the database proto to a perfect client-side proto: 1. Grab the following files from the conf folder in the server files: mob_proto.txt mob_names.txt item_proto.txt item_names.txt 2. Put those files in a folder with the "dump_proto.exe" tool and run it. It will automatically generate the protos for your client assuming you have followed the correct structure of the txt files. Download: [Hidden Content] (Updated: March 13th, 2014) - No password (I don't believe in putting passwords on archives released to the public).
    0 points
  28. Try this: Open PythonMiniMap and search this: Then, after this add: Just insert your ID in array blockID.
    0 points
  29. no its not possible, you will need to modify the source structure, its simply not made for changes like that. You know? P2P (core to core communication) something like this exist for npc too. Google for npcToNpc communication. You can learn a lot my friend
    0 points
  30. 0 points
  31. Problem with socket0 (item time) I tried to put in 30 days, but it didn't work, so I took the full timestamp and it worked, however, time goes on, even in the store Can anyone help me fix: - Add in socket0 only 2592000 for 30 days, not "1615058951" - Time does not count while the item is in the store
    0 points
×
×
  • 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.