Jump to content

Reached

Active+ Member
  • Posts

    56
  • Joined

  • Last visited

  • Days Won

    1
  • Feedback

    100%

Reached last won the day on March 1

Reached had the most liked content!

4 Followers

About Reached

  • Birthday 01/03/2002

Informations

  • Gender
    Male
  • Country
    Turkey
  • Nationality
    Turkish

Recent Profile Visitors

4594 profile views

Reached's Achievements

Rising Star

Rising Star (9/16)

  • Collaborator Rare
  • Very Popular Rare
  • Dedicated
  • Reacting Well
  • First Post

Recent Badges

815

Reputation

  1. // Search bool g_isEmpireNameMode=false; // Add under static DWORD gs_dwDamagePrefixCriticalCRC = 0; static DWORD gs_dwDamagePrefixPenetrationCRC = 0; static DWORD gs_dwDamagePrefixMixCRC = 0; // Search DWORD index = 0; DWORD num = 0; // Add under const DWORD originalDamage = damage; // Search func void CInstanceBase::ProcessDamage() // Add at the end of the function const bool isCritical = (flag & DAMAGE_CRITICAL) != 0; const bool isPenetrate = (flag & DAMAGE_PENETRATE) != 0; if (isCritical || isPenetrate) { DWORD* pdwPrefixCRC = NULL; const char* c_szPrefixEffectPath = NULL; if (isCritical && isPenetrate) { pdwPrefixCRC = &gs_dwDamagePrefixMixCRC; c_szPrefixEffectPath = "d:/ymir work/effect/affect/damage_mix.mse"; } else if (isCritical) { pdwPrefixCRC = &gs_dwDamagePrefixCriticalCRC; c_szPrefixEffectPath = "d:/ymir work/effect/affect/damage_critical.mse"; } else { pdwPrefixCRC = &gs_dwDamagePrefixPenetrationCRC; c_szPrefixEffectPath = "d:/ymir work/effect/affect/damage_penetration.mse"; } if (pdwPrefixCRC && *pdwPrefixCRC == 0) { if (!rkEftMgr.RegisterEffect2(c_szPrefixEffectPath, pdwPrefixCRC, true)) TraceError("CInstanceBase::ProcessDamage - RegisterEffect2 failed (%s)", c_szPrefixEffectPath); } if (pdwPrefixCRC && *pdwPrefixCRC) { DWORD digitCount = 0; DWORD tempDamage = originalDamage; constexpr float fPrefixPadding = 18.0f; while (tempDamage > 0) { ++digitCount; tempDamage /= 10; } D3DXMATRIX matrix, matTrans; D3DXMatrixIdentity(&matrix); matrix._41 = v3Pos.x; matrix._42 = v3Pos.y; matrix._43 = v3Pos.z; D3DXMatrixTranslation(&matrix, v3Pos.x, v3Pos.y, v3Pos.z); D3DXMatrixMultiply(&matrix, &pCamera->GetInverseViewMatrix(), &matrix); D3DXMatrixTranslation(&matTrans, (FONT_WIDTH * digitCount) + fPrefixPadding, 0, 0); matTrans._41 = -matTrans._41; matrix = matTrans * matrix; D3DXMatrixMultiply(&matrix, &pCamera->GetViewMatrix(), &matrix); rkEftMgr.CreateEffect(*pdwPrefixCRC, D3DXVECTOR3(matrix._41, matrix._42, matrix._43), v3Rot); } } Download
      • 37
      • Good
      • Love
      • Metin2 Dev
      • Love
      • Eyes
      • muscle
  2. They're crashing the game by sending randomly sized packets during the handshake/login phase, inflating the buffer size from different connections. A 65kb buffer is opened for each connection. m_lpInputBuffer = buffer_new(MAX_INPUT_LEN); When this buffer is filled with many connections from different designs, the channel reaches its 4gb memory limit and crashes. The change we made checks the total bytes received from the session during handshake and login (When simulated, the total data flow is 1.25kb max @ Koray <3) and bans the IP if it exceeds the potential data to be received. A host will also get banned if it receives more connections than the limit we set. Forgotten part: desc.cpp //Search SetPhase(PHASE_HANDSHAKE); StartHandshake(_handshake); // Add above { desc_event_info* timeout_info = AllocEventInfo<desc_event_info>(); timeout_info->desc = this; m_pkPhaseTimeoutEvent = event_create(phase_timeout_event, timeout_info, PASSES_PER_SEC(DESC_HANDSHAKE_TIMEOUT_SEC)); } // Search m_pInputProcessor = &m_inputMain; // Add under event_cancel(&m_pkPhaseTimeoutEvent); DESC_MANAGER::instance().DecUnauthCount(this); Download Alternative download links → Alternate_1 or Alternate_2 or Alternate_3
      • 68
      • Metin2 Dev
      • Love
      • Flame
      • Good
  3. The system is configured via a table with mobvnum and damage. It is updated instantly across all channels with a reload. Players can exceed this limit with the Damage Limiter Removal item.
  4. I saw this feature at @ Mali's topic. It really caught my interest, so i decided to build my own version.
      • 4
      • Metin2 Dev
      • Good
      • Love
  5. I needed something like this when i code a system. It stores the effects in a container on the client side. It allows you to do things like the example below. Download
      • 27
      • Love
      • Love
      • Metin2 Dev
      • Good
  6. Players are initially randomly sent to one of three teleport points, with PvP disabled. At the beginning of the event, there are invisible walls at the entrances. When the event is started by the admin, a countdown from 10 begins, and the fences are removed, followed by PvP. There are six biomes (Fire, Lightning, Ice, Earth, Wind, Darkness). Monsters appear first in these biomes, and after they are slaughtered, the biome boss appears. Each biome has its own announcement and is completely randomly assigned, varying from arena to arena. A guild PvP and points ranking system has been implemented to create a competitive environment. A damage ranking system (bottom left) is also implemented to create competition when killing bosses. Outside the arena, the global rankings for all arenas are displayed, and inside the arena, the current rankings for that arena are displayed. +5 points for kills in PvP. +10 points are awarded to the guild that deals the most damage to the biome boss. When all biome bosses are defeated, the final boss appears in the center. The guild with the highest score until the final boss appears gains a +10% bonus against the final boss. After the final boss is defeated, all guilds other than the guild with the highest damage are sent back to their villages. Afterward, measures such as logging in is blocked or being held in the character and then logging in again are implemented. 10 seconds after the other guilds are defeated, a reward chest appears, and the champion receives the guild reward. 30 seconds after the chest is defeated, all members are sent back to their villages. All settings are made here as shown in the screenshot and can be adjusted in a simple manner.
      • 1
      • Metin2 Dev
  7. Thank you for corrections, i'm not currently playing on Official Server so i made like this (Reflecting all damage like skill hit etc.).
  8. Yeah, just like berserk or stoneskin.
  9. In the first phase, it throws a total of 12 areas on the ground, when you enter these areas you will take a fixed amount of damage, changing from difficult to easy. It throws an area under a random player who is not dead at 12 seconds. It throws a thorn under the players at 20 seconds and deals damage to the players inside it in a hard-easy manner until it explodes. In the Reflect section, which is the first skill of the boss, it reflects half of the damage taken by the players during the shutdown to all players in a way that starts when Alastor enters the animation. The boss's second skill explodes an area around itself, the players who eat it are stunned for 3 seconds and deal damage in a hard-easy manner. The boss's third and last skill rains small areas around itself and deals damage to the players inside it in the same hard-easy manner. When the pools are not experiencing any glitches (as long as no one is dead), it throws the last area around 27:30 and you can pull the boss to the corner, apply the mechanics of the skill and kill him as in the Official game. I haven't prepared the easy-hard introduction parts yet, I haven't prepared the reward part yet, they will be updated too I'm thinking of adding it.
      • 6
      • Metin2 Dev
      • Love
  10. The reflect aiflag found in the Official game's protos allows the mob to reflect y% of the damage dealt under x% health. char_state.cpp // Search bool CHARACTER::IsStoneSkinner() const // Add Above bool CHARACTER::IsReflector() const { return IS_SET(m_pointsInstant.dwAIFlag, AIFLAG_REFLECT); } // search in CHARACTER::__StateIdle_Monster() if (IsGodSpeeder()) if (IsGodSpeed()) SetGodSpeed(false); // Add below if (IsReflector()) if (IsReflect()) SetReflect(false); // search in CHARACTER::StateBattle() if (IsGodSpeeder() == true) if (GetHPPct() < m_pkMobData->m_table.bGodSpeedPoint) if (IsGodSpeed() != true) SetGodSpeed(true); // Add above if (IsReflector() == true) if (GetHPPct() < 25) if (IsReflect() != true) SetReflect(true); char_battle.cpp // Search in ::Damage SendDamagePacket(pAttacker, dam, damageFlag); // Add above if (pAttacker && pAttacker->IsPC() && IsNPC() && IsReflect()) pAttacker->SendDamagePacket(this, dam/100*5, damageFlag); char.h // Search bool IsBerserker() const; bool IsBerserk() const; void SetBerserk(bool mode); // Add below bool IsReflector() const; bool IsReflect() const; void SetReflect(bool mode); char.cpp // Search bool CHARACTER::IsGodSpeed() const // Add above bool CHARACTER::IsReflect() const { if (m_pkMobInst != nullptr) return m_pkMobInst->m_IsReflect; else return false; } void CHARACTER::SetReflect(bool mode) { if (m_pkMobInst != nullptr) m_pkMobInst->m_IsReflect = mode; } mob_manager.cpp // Search CMobInstance::CMobInstance() : m_IsBerserk(false), m_IsGodSpeed(false), m_IsRevive(false), // Add , m_IsReflect(false) mob_manager.h // Search bool m_IsRevive; // Add below bool m_IsReflect; + I didn't include it here but in length.h enum EAIFlags into AIFLAG_REFLECT and in your ProtoReader file get_Mob_AIFlag_Value function, after including it as "REFLECT" in the array, when the mobs you give REFLECT as aiflag in mob_proto have less than 25% health, it reflects 5% of the damage you deal back to you. I preferred to make these parts static, if you wish, you can open columns like berserk, stoneskin in mob proto and dynamically set how many health points it will reflect and how many damage points it will reflect back.
  11. Biolog System The system consists entirely of dynamic packages, you can add an instant biologist task. (With a simple reload command) There is a table where you can easily set the quests. You can access the market from the interface. You can choose 3 or one bonus from the 3 with the "bIsChoosable" value. You can easily set the biologist item that will drop from mobs from simple table. I preferred the Rubinum server interface as the interface, if you have any suggestions, you can write.
  12. Royale Pass
  13. Continuation of the guild donation system, Attendance System for Guild. Everyday player can take attendance reward once. Attendance rewards will be reset at every 05:00 A.M. When the day changes, you can receive rewards based on your participation on that day. System is give you bonuses when you complete given tasks. You can add new tasks insantly Mission progress is updated instantly. (Only when the window is open to avoid unnecessary packet flow.) It works on a single affect, so you don't need to create an affect for each quest. Proggression works entirely via cache.
  14. Your daily donate limit and buy limit resets every 05:00 A.M.
  15. Hello, this is a script that will help you fill in the empty spaces of the folder section of the mount caused by missing additions in mob_proto. import os import chardet ITEM_PROTO_PATH = "item_proto.txt" MOB_PROTO_PATH = "mob_proto.txt" NPC_LIST_PATH = "npclist.txt" LOG_FILE_PATH = "no_folder_mounts.txt" MOB_NAMES_FILE_PATH = "mob_names.txt" MOUNT_WITH_FOLDERS = "mount_with_folders.txt" SERVER_DATA_FOLDER = "C:\\git\\CarbonSFv2\\server\\srv1\\share\\data\\monster" SERVER_MISSING_FOLDERS = "server_missing_folders.txt" MOUNT_TYPE = "ITEM_COSTUME" MOUNT_SUBTYPE = "COSTUME_MOUNT" MOUNT_LIST = [] MOUNT_WITH_NO_FOLDER = [] ITEM_TYPE = 2 ITEM_SUBTYPE = 3 ITEM_MOUNT_VALUE = 28 MOB_PROTO_MOUNT_VNUM = 0 MOB_PROTO_FOLDER_INDEX = 12 def process_file(file_path): with open(file_path, 'rb') as file: rawdata = file.read() encoding = chardet.detect(rawdata)['encoding'] #convert to utf-8 if not already if encoding and encoding.lower() != 'utf-8': with open(file_path, 'r', encoding=encoding) as file: content = file.read() with open(file_path, 'w', encoding='utf-8') as file: file.write(content) def checkCostumeMount(file_path): with open(file_path, 'r') as file: for line in file: if not line.strip(): continue split = line.split('\t') try: if split[ITEM_TYPE] == MOUNT_TYPE and split[ITEM_SUBTYPE] == MOUNT_SUBTYPE: MOUNT_LIST.append(split[ITEM_MOUNT_VALUE]) except IndexError: print("Index Error on line: " + line) def checkMobLine(file_path): process_file(file_path) with open(file_path, 'r', encoding='utf-8') as file: try: for line in file: if not line.strip(): continue split = line.split('\t') try: if split[MOB_PROTO_MOUNT_VNUM] in MOUNT_LIST and split[MOB_PROTO_FOLDER_INDEX] == "": print("Mount with no folder: " + split[MOB_PROTO_MOUNT_VNUM]) MOUNT_WITH_NO_FOLDER.append(split[MOB_PROTO_MOUNT_VNUM]) except IndexError: print("Index Error on line: " + line) except UnicodeDecodeError: print("UnicodeDecodeError on line: " + line) def writeIntoFile(file_path, log_file_path): logFile = open(log_file_path, 'w') with open(file_path, 'r') as file: for line in file: if not line.strip(): continue split = line.split('\t') try: if split[0] in MOUNT_WITH_NO_FOLDER: logFile.write(line) except IndexError: print("Index Error on line: " + line) logFile.close() def setFolder(file_path): mountWithFolders = open(MOUNT_WITH_FOLDERS, 'w') with open(file_path, 'r') as file: for line in file: if not line.strip(): continue split = line.split('\t') try: if split[0] in MOUNT_WITH_NO_FOLDER: mountWithFolders.write(line) except IndexError: print("Index Error on line: " + line) mountWithFolders.close() def checkFolderExist(folder_path): serverMissingFolders = open(SERVER_MISSING_FOLDERS, 'w') with open(MOUNT_WITH_FOLDERS, 'r') as file: for line in file: if not line.strip(): continue split = line.split('\t') folder = os.path.join(folder_path, split[1]) if not os.path.exists(folder): serverMissingFolders.write(folder + "\n") else: print("Folder exists: " + folder) serverMissingFolders.close() def main(): checkCostumeMount(ITEM_PROTO_PATH) checkMobLine(MOB_PROTO_PATH) writeIntoFile(MOB_NAMES_FILE_PATH, LOG_FILE_PATH) setFolder(NPC_LIST_PATH) checkFolderExist(SERVER_DATA_FOLDER) if __name__ == "__main__": main() Tutorial There are files for the vnums you need to complete in the mount_with_folder.txt file. You can complete the missing
×
×
  • 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.