-
Posts
81 -
Joined
-
Last visited
-
Feedback
0%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by OkamiRo
-
-
UP, have the same problem here with g++7.
-
Just posted here in case someone need in one day like me...
Open from you db source Main.cpp
Search
#ifdef __FreeBSD__ _malloc_options = "A"; #endif
Replace with
#if defined (__FreeBSD__) && !defined (__GNUC__) _malloc_options = "A"; #endif
-
bump same problem here
@MUZI know it's funny cause this topic was from 2016, i found the solution
Perhaps my server accept connections from outside of the server with auth exploit, however i have fixed it.
- 1
-
UP
I have the same problem here.
-
-
-
-
3 hours ago, Catalin2o14 said:
Thank you so much, i've been struggling with this bug since 3 months ago, now it's working perfectly!
-
58 minutes ago, Catalin2o14 said:
this function seems ok.
put this function:
mountSystem->Mount
Could you please let me know exactly what do you need? I don't really understeand where i can find this function:
mountSystem->Mount
MountSystem.cpp
#include "stdafx.h" #include "config.h" #include "utils.h" #include "vector.h" #include "char.h" #include "sectree_manager.h" #include "char_manager.h" #include "mob_manager.h" #include "MountSystem.h" #include "../../common/VnumHelper.h" #include "packet.h" #include "item_manager.h" #include "item.h" EVENTINFO(mountsystem_event_info) { CMountSystem* pMountSystem; }; EVENTFUNC(mountsystem_update_event) { mountsystem_event_info* info = dynamic_cast<mountsystem_event_info*>( event->info ); if ( info == NULL ) { sys_err( "<mountsystem_update_event> <Factor> Null pointer" ); return 0; } CMountSystem* pMountSystem = info->pMountSystem; if (NULL == pMountSystem) return 0; pMountSystem->Update(0); return PASSES_PER_SEC(1) / 4; } /////////////////////////////////////////////////////////////////////////////////////// // CMountActor /////////////////////////////////////////////////////////////////////////////////////// CMountActor::CMountActor(LPCHARACTER owner, DWORD vnum) { m_dwVnum = vnum; m_dwVID = 0; m_dwLastActionTime = 0; m_pkChar = 0; m_pkOwner = owner; m_originalMoveSpeed = 0; m_dwSummonItemVID = 0; m_dwSummonItemVnum = 0; } CMountActor::~CMountActor() { this->Unsummon(); m_pkOwner = 0; } void CMountActor::SetName() { std::string petName = m_pkOwner->GetName(); if (true == IsSummoned()) { petName += " Mount"; m_pkChar->SetName(petName); } m_name = petName; } bool CMountActor::Mount(LPITEM mountItem) { if (0 == m_pkOwner) return false; if(!mountItem) return false; if (m_pkOwner->IsHorseRiding()) m_pkOwner->StopRiding(); if (m_pkOwner->GetHorse()) m_pkOwner->HorseSummon(false); Unmount(); m_pkOwner->AddAffect(AFFECT_MOUNT, POINT_MOUNT, m_dwVnum, AFF_NONE, (DWORD)mountItem->GetSocket(0) - time(0), 0, true); for (int i = 0; i < ITEM_APPLY_MAX_NUM; ++i) { if (mountItem->GetProto()->aApplies[i].bType == APPLY_NONE) continue; m_pkOwner->AddAffect(AFFECT_MOUNT_BONUS, aApplyInfo[mountItem->GetProto()->aApplies[i].bType].bPointType, mountItem->GetProto()->aApplies[i].lValue, AFF_NONE, (DWORD)mountItem->GetSocket(0) - time(0), 0, false); } return m_pkOwner->GetMountVnum() == m_dwVnum; } void CMountActor::Unmount() { if (0 == m_pkOwner) return; if (!m_pkOwner->GetMountVnum()) return; m_pkOwner->RemoveAffect(AFFECT_MOUNT); m_pkOwner->RemoveAffect(AFFECT_MOUNT_BONUS); m_pkOwner->MountVnum(0); if (m_pkOwner->IsHorseRiding()) m_pkOwner->StopRiding(); if (m_pkOwner->GetHorse()) m_pkOwner->HorseSummon(false); m_pkOwner->MountVnum(0); } void CMountActor::Unsummon() { if (true == this->IsSummoned()) { this->SetSummonItem(NULL); if (NULL != m_pkChar) M2_DESTROY_CHARACTER(m_pkChar); m_pkChar = 0; m_dwVID = 0; } } DWORD CMountActor::Summon(LPITEM pSummonItem, bool bSpawnFar) { long x = m_pkOwner->GetX(); long y = m_pkOwner->GetY(); long z = m_pkOwner->GetZ(); if (true == bSpawnFar) { x += (number(0, 1) * 2 - 1) * number(2000, 2500); y += (number(0, 1) * 2 - 1) * number(2000, 2500); } else { x += number(-100, 100); y += number(-100, 100); } if (0 != m_pkChar) { m_pkChar->Show(m_pkOwner->GetMapIndex(), x, y); m_dwVID = m_pkChar->GetVID(); return m_dwVID; } m_pkChar = CHARACTER_MANAGER::instance().SpawnMob(m_dwVnum, m_pkOwner->GetMapIndex(), x, y, z, false, (int)(m_pkOwner->GetRotation()+180), false); if (0 == m_pkChar) { sys_err("[CMountActor::Summon] Failed to summon the mount. (vnum: %d)", m_dwVnum); return 0; } m_pkChar->SetMount(); m_pkChar->SetEmpire(m_pkOwner->GetEmpire()); m_dwVID = m_pkChar->GetVID(); this->SetName(); this->SetSummonItem(pSummonItem); //m_pkOwner->ComputePoints(); m_pkChar->Show(m_pkOwner->GetMapIndex(), x, y, z); return m_dwVID; } bool CMountActor::_UpdateFollowAI() { if (0 == m_pkChar->m_pkMobData) { return false; } if (0 == m_originalMoveSpeed) { const CMob* mobData = CMobManager::Instance().Get(m_dwVnum); if (0 != mobData) m_originalMoveSpeed = mobData->m_table.sMovingSpeed; } float START_FOLLOW_DISTANCE = 300.0f; float START_RUN_DISTANCE = 900.0f; float RESPAWN_DISTANCE = 4500.f; int APPROACH = 200; bool bRun = false; DWORD currentTime = get_dword_time(); long ownerX = m_pkOwner->GetX(); long ownerY = m_pkOwner->GetY(); long charX = m_pkChar->GetX(); long charY = m_pkChar->GetY(); float fDist = DISTANCE_APPROX(charX - ownerX, charY - ownerY); if (fDist >= RESPAWN_DISTANCE) { float fOwnerRot = m_pkOwner->GetRotation() * 3.141592f / 180.f; float fx = -APPROACH * cos(fOwnerRot); float fy = -APPROACH * sin(fOwnerRot); if (m_pkChar->Show(m_pkOwner->GetMapIndex(), ownerX + fx, ownerY + fy)) { return true; } } if (fDist >= START_FOLLOW_DISTANCE) { m_pkChar->SetNowWalking(false); Follow(APPROACH); m_pkChar->SetLastAttacked(currentTime); m_dwLastActionTime = currentTime; } else m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0); return true; } bool CMountActor::Update(DWORD deltaTime) { bool bResult = true; if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID()) || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner() ) { this->Unsummon(); return true; } if (this->IsSummoned()) bResult = bResult && this->_UpdateFollowAI(); return bResult; } bool CMountActor::Follow(float fMinDistance) { if( !m_pkOwner || !m_pkChar) return false; float fOwnerX = m_pkOwner->GetX(); float fOwnerY = m_pkOwner->GetY(); float fPetX = m_pkChar->GetX(); float fPetY = m_pkChar->GetY(); float fDist = DISTANCE_SQRT(fOwnerX - fPetX, fOwnerY - fPetY); if (fDist <= fMinDistance) return false; m_pkChar->SetRotationToXY(fOwnerX, fOwnerY); float fx, fy; float fDistToGo = fDist - fMinDistance; GetDeltaByDegree(m_pkChar->GetRotation(), fDistToGo, &fx, &fy); if (!m_pkChar->Goto((int)(fPetX+fx+0.5f), (int)(fPetY+fy+0.5f)) ) return false; m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0, 0); return true; } void CMountActor::SetSummonItem(LPITEM pItem) { if (NULL == pItem) { m_dwSummonItemVID = 0; m_dwSummonItemVnum = 0; return; } m_dwSummonItemVID = pItem->GetVID(); m_dwSummonItemVnum = pItem->GetVnum(); } /////////////////////////////////////////////////////////////////////////////////////// // CMountSystem /////////////////////////////////////////////////////////////////////////////////////// CMountSystem::CMountSystem(LPCHARACTER owner) { m_pkOwner = owner; m_dwUpdatePeriod = 400; m_dwLastUpdateTime = 0; } CMountSystem::~CMountSystem() { Destroy(); } void CMountSystem::Destroy() { for (TMountActorMap::iterator iter = m_mountActorMap.begin(); iter != m_mountActorMap.end(); ++iter) { CMountActor* mountActor = iter->second; if (0 != mountActor) { delete mountActor; } } event_cancel(&m_pkMountSystemUpdateEvent); m_mountActorMap.clear(); } bool CMountSystem::Update(DWORD deltaTime) { bool bResult = true; DWORD currentTime = get_dword_time(); if (m_dwUpdatePeriod > currentTime - m_dwLastUpdateTime) return true; std::vector <CMountActor*> v_garbageActor; for (TMountActorMap::iterator iter = m_mountActorMap.begin(); iter != m_mountActorMap.end(); ++iter) { CMountActor* mountActor = iter->second; if (0 != mountActor && mountActor->IsSummoned()) { LPCHARACTER pMount = mountActor->GetCharacter(); if (NULL == CHARACTER_MANAGER::instance().Find(pMount->GetVID())) { v_garbageActor.push_back(mountActor); } else { bResult = bResult && mountActor->Update(deltaTime); } } } for (std::vector<CMountActor*>::iterator it = v_garbageActor.begin(); it != v_garbageActor.end(); it++) DeleteMount(*it); m_dwLastUpdateTime = currentTime; return bResult; } void CMountSystem::DeleteMount(DWORD mobVnum) { TMountActorMap::iterator iter = m_mountActorMap.find(mobVnum); if (m_mountActorMap.end() == iter) { sys_err("[CMountSystem::DeleteMount] Can't find mount on my list (VNUM: %d)", mobVnum); return; } CMountActor* mountActor = iter->second; if (0 == mountActor) sys_err("[CMountSystem::DeleteMount] Null Pointer (mountActor)"); else delete mountActor; m_mountActorMap.erase(iter); } void CMountSystem::DeleteMount(CMountActor* mountActor) { for (TMountActorMap::iterator iter = m_mountActorMap.begin(); iter != m_mountActorMap.end(); ++iter) { if (iter->second == mountActor) { delete mountActor; m_mountActorMap.erase(iter); return; } } sys_err("[CMountSystem::DeleteMount] Can't find mountActor(0x%x) on my list(size: %d) ", mountActor, m_mountActorMap.size()); } void CMountSystem::Unsummon(DWORD vnum, bool bDeleteFromList) { //if (m_pkOwner->IncreaseMountCounter() >= 5) //{ // m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("_TRANSLATE_CHAT_TYPE_PACKETS_FROM_SOURCE_TO_GLOBAL__TRANSLATE_LIST_110")); // return; //} CMountActor* actor = this->GetByVnum(vnum); if (0 == actor) { sys_err("[CMountSystem::Unsummon(%d)] Null Pointer (actor)", vnum); return; } actor->Unsummon(); if (true == bDeleteFromList) this->DeleteMount(actor); bool bActive = false; for (TMountActorMap::iterator it = m_mountActorMap.begin(); it != m_mountActorMap.end(); it++) { bActive |= it->second->IsSummoned(); } if (false == bActive) { event_cancel(&m_pkMountSystemUpdateEvent); m_pkMountSystemUpdateEvent = NULL; } } void CMountSystem::Summon(DWORD mobVnum, LPITEM pSummonItem, bool bSpawnFar) { //if (m_pkOwner->IncreaseMountCounter() >= 5) //{ // m_pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("_TRANSLATE_CHAT_TYPE_PACKETS_FROM_SOURCE_TO_GLOBAL__TRANSLATE_LIST_110")); // return; //} CMountActor* mountActor = this->GetByVnum(mobVnum); if (0 == mountActor) { mountActor = M2_NEW CMountActor(m_pkOwner, mobVnum); m_mountActorMap.insert(std::make_pair(mobVnum, mountActor)); } DWORD mountVID = mountActor->Summon(pSummonItem, bSpawnFar); if (!mountVID) sys_err("[CMountSystem::Summon(%d)] Null Pointer (mountVID)", pSummonItem->GetID()); if (NULL == m_pkMountSystemUpdateEvent) { mountsystem_event_info* info = AllocEventInfo<mountsystem_event_info>(); info->pMountSystem = this; m_pkMountSystemUpdateEvent = event_create(mountsystem_update_event, info, PASSES_PER_SEC(1) / 4); } //return mountActor; } void CMountSystem::Mount(DWORD mobVnum, LPITEM mountItem) { CMountActor* mountActor = this->GetByVnum(mobVnum); if (!mountActor) { sys_err("[CMountSystem::Mount] Null Pointer (mountActor)"); return; } if(!mountItem) return; //check timer // if (m_pkOwner->IncreaseMountCounter() >= 5) // { // m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "<Mount> Asteapta 5 secunde pentru a face aceasta actiune"); // return; // } this->Unsummon(mobVnum, false); mountActor->Mount(mountItem); } void CMountSystem::Unmount(DWORD mobVnum) { CMountActor* mountActor = this->GetByVnum(mobVnum); if (!mountActor) { sys_err("[CMountSystem::Mount] Null Pointer (mountActor)"); return; } //check timer // if (m_pkOwner->IncreaseMountCounter() >= 5) // { // m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "<Mount> Asteapta 5 secunde pentru a face aceasta actiune"); // return; // } if(LPITEM pSummonItem = m_pkOwner->GetWear(WEAR_COSTUME_MOUNT)) { this->Summon(mobVnum, pSummonItem, false); } mountActor->Unmount(); } CMountActor* CMountSystem::GetByVID(DWORD vid) const { CMountActor* mountActor = 0; bool bFound = false; for (TMountActorMap::const_iterator iter = m_mountActorMap.begin(); iter != m_mountActorMap.end(); ++iter) { mountActor = iter->second; if (0 == mountActor) { sys_err("[CMountSystem::GetByVID(%d)] Null Pointer (mountActor)", vid); continue; } bFound = mountActor->GetVID() == vid; if (true == bFound) break; } return bFound ? mountActor : 0; } CMountActor* CMountSystem::GetByVnum(DWORD vnum) const { CMountActor* mountActor = 0; TMountActorMap::const_iterator iter = m_mountActorMap.find(vnum); if (m_mountActorMap.end() != iter) mountActor = iter->second; return mountActor; } size_t CMountSystem::CountSummoned() const { size_t count = 0; for (TMountActorMap::const_iterator iter = m_mountActorMap.begin(); iter != m_mountActorMap.end(); ++iter) { CMountActor* mountActor = iter->second; if (0 != mountActor) { if (mountActor->IsSummoned()) ++count; } } return count; }
MountSystem.h
#ifndef __HEADER_MOUNT_SYSTEM__ #define __HEADER_MOUNT_SYSTEM__ class CHARACTER; class CMountActor { protected: friend class CMountSystem; CMountActor(LPCHARACTER owner, DWORD vnum); virtual ~CMountActor(); virtual bool Update(DWORD deltaTime); virtual bool _UpdateFollowAI(); private: bool Follow(float fMinDistance = 50.f); public: LPCHARACTER GetCharacter() const { return m_pkChar; } LPCHARACTER GetOwner() const { return m_pkOwner; } DWORD GetVID() const { return m_dwVID; } DWORD GetVnum() const { return m_dwVnum; } void SetName(); bool Mount(LPITEM mountItem); void Unmount(); DWORD Summon(LPITEM pSummonItem, bool bSpawnFar = false); void Unsummon(); bool IsSummoned() const { return 0 != m_pkChar; } void SetSummonItem (LPITEM pItem); DWORD GetSummonItemVID () { return m_dwSummonItemVID; } private: DWORD m_dwVnum; DWORD m_dwVID; DWORD m_dwLastActionTime; DWORD m_dwSummonItemVID; DWORD m_dwSummonItemVnum; short m_originalMoveSpeed; std::string m_name; LPCHARACTER m_pkChar; LPCHARACTER m_pkOwner; }; class CMountSystem { public: typedef boost::unordered_map<DWORD, CMountActor*> TMountActorMap; public: CMountSystem(LPCHARACTER owner); virtual ~CMountSystem(); CMountActor* GetByVID(DWORD vid) const; CMountActor* GetByVnum(DWORD vnum) const; bool Update(DWORD deltaTime); void Destroy(); size_t CountSummoned() const; public: void SetUpdatePeriod(DWORD ms); void Summon(DWORD mobVnum, LPITEM pSummonItem, bool bSpawnFar); void Unsummon(DWORD mobVnum, bool bDeleteFromList = false); void Unsummon(CMountActor* mountActor, bool bDeleteFromList = false); void Mount(DWORD mobVnum, LPITEM mountItem); void Unmount(DWORD mobVnum); void DeleteMount(DWORD mobVnum); void DeleteMount(CMountActor* mountActor); private: TMountActorMap m_mountActorMap; LPCHARACTER m_pkOwner; DWORD m_dwUpdatePeriod; DWORD m_dwLastUpdateTime; LPEVENT m_pkMountSystemUpdateEvent; }; #endif
-
Make sure after update your client that the version should to be 0.0.3.
Offline shop fix:
For the moment you can edit your shop without taking off your armor / costume.Other fix / improvements:
Now you can acces storage by using item shop storage button in inventory.
Global chat / pm normal chat it's working correctly now.
The shout chat will display your kingdom (colored).
Team shout will be known as Team (yellow colorized) then followed by name.
To understeand other kingdoms players you need to read books or wear a Language Ring.
* Language Ring or books can be obtained from drop (books) and Moonlight Treasure Chest.
When you die the skills cooldown time reset to zero.
Alignment for male / female changed (Noble'f / Noble'm).
Leader and Co-Leader for guilds will be available.
Skills fixed when you ride a horse / mount.
When you die the horse won't dissapear.
Now while farming you can see mobs / stones HP in percentage (% left).Română:
Asigurați-vă că, după actualizarea clientului dvs., versiunea clientului trebuie să fie 0.0.3.
Rezolvarea magazinului offline:
Pentru moment poți să îți editezi magazinul fără să-ți dai jos armura / costumul.
Fix-uri / îmbunătățiri:
Acum puteți accesa depozitul folosind butonul de depozit itemshop din inventory.
Chat global / pm chat normal funcționează corect acum.
Chatul ''strigă'' va afișa regatul tău (colorat).
Chatul ''strigă'' al echipei va fi cunoscut sub numele de Team (colorat galben) apoi urmat de nume.
Pentru a înțelege alți jucători de regate, trebuie să citiți cărți sau să purtați un inel de limbă.
* Inelul de limbă sau cărțile pot fi obținute din drop (cărți) și din Moonlight Treasure Chest.
Când mori timpul de folosire a abilitățile este resetat la zero.
Gradul positive / negative pentru bărbat / femeie schimbat (Nobil'f / Nobil'm).
Leader și co-lider pentru bresle înainte numelui breslei este disponibil acum.
Aptitudini (skills) fixate atunci când mergeți pe un cal / mount.
Când mori în luptă călărind, calul nu va mai dispărea.
În timpul farm-ului sau când creșteți, puteți vedea HP-ul pentru mobi / pietre în procent (% rămas). -
10 hours ago, Catalin2o14 said:
post the do_ride from cmd_general.
Here:
ACMD(do_ride) { // dev_log(LOG_DEB0, "[DO_RIDE] start"); if (ch->IsDead() || ch->IsStun()) return; if (ch->GetMapIndex() == 113) return; #ifdef ENABLE_MOUNT_COSTUME_SYSTEM if (ch->IsPolymorphed() == true){ ch->ChatPacket(CHAT_TYPE_INFO, "Cannot use a mount when you're transformed."); return; } if(ch->GetWear(WEAR_COSTUME_MOUNT)) { CMountSystem* mountSystem = ch->GetMountSystem(); LPITEM mount = ch->GetWear(WEAR_COSTUME_MOUNT); DWORD mobVnum = 0; if (!mountSystem && !mount) return; #ifdef __CHANGELOOK_SYSTEM__ if(mount->GetTransmutation()) { const TItemTable* itemTable = ITEM_MANAGER::instance().GetTable(mount->GetTransmutation()); if (itemTable) mobVnum = itemTable->alValues[1]; else mobVnum = mount->GetValue(1); } else mobVnum = mount->GetValue(1); #else if(mount->GetValue(1) != 0) mobVnum = mount->GetValue(1); #endif if (ch->GetMountVnum()) { if(mountSystem->CountSummoned() == 0) { mountSystem->Unmount(mobVnum); } } else { if(mountSystem->CountSummoned() == 1) { mountSystem->Mount(mobVnum, mount); } } return; } #endif if (ch->IsHorseRiding()) { ch->StopRiding(); return; } if (ch->GetHorse() != NULL) { ch->StartRiding(); return; } for (BYTE i=0; i<INVENTORY_MAX_NUM; ++i) { LPITEM item = ch->GetInventoryItem(i); if (NULL == item) continue; if (item->GetType() == ITEM_COSTUME && item->GetSubType() == COSTUME_MOUNT) { ch->UseItem(TItemPos (INVENTORY, i)); return; } } ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("cmd_general.cpp line 2452: Summon the horse first.")); }
-
Same problem here.
-
Bug fix:
Teleportation ring fixes
- No more unlimited Next pages
- Level protection for high level maps to avoid accidental teleportation
- No more negative count if you just closed a shop and didn't wait 10 seconds
- Cannot be stored, dropable, stackable, tradeable
Bonus Defence against blackouts (imune bonus) it's working now in duel and aganist monster aswell
If you have Khan in inventory/deposit, only the activated one elapses
Drop fix regarding the Ebony Bracelt and secondary books
Common drop fixed
Client crash fix
Level update in real time fix
Visual bug regarding shop names above head of characters/mob fixed
News:
Special Store is a new NPC
- Here you can obtain objects like Enchant Item, Blessing Marble, etc
- This NPC is part of seasonal events
In the Upgrades window you can obtain items with yang, seeds or fragments.
New items in common drop (this items drop everywhere)
- Seeds of Blessing Marble for Blessing Marble
- Fragment Upgrade Blue for Reinforce Item
- Fragment Upgrade Red for Enchant Item
- Fragment of Medicine for Blessing of the Dragon
Dose of Pepsi for Pepsi event only, not in common drop.
A new event Doses of Pepsi is active, you collect Doses of Pepsi and exchange them in General Store to buy Ice Cream.
Ice Cream can be spend to buy Khan or Bernie in the same shop.
Changes in Summer event
- Ice Cream with Syrup can be used in Special Store to buy Cooling Box
- 1x Cooling box is 10x Ice Cream with Syrup.
Make sure your client is runing version 0.0.2 for this update, to avoid visual bug and client crash. -
-
On 8/6/2015 at 4:17 PM, alphavladim said:
Solved myself.
How? I have the same problem.
-
Last changes:
Fencing Pamphlet is now stackable.
Power Chest is no stackable.Playtime text changed for a better aspect, instead of xDays xHours xMinutes.
Choose server interface get few colors, for a better design.
Form now you can see game version (number will be increased once we launch a new update, now we run on version 0.0.1).
-
Hello Ancients!
This summer stay home and play Ancient2, we promise you will never get bored and this event rewards will make you cooler B-)
Details about event:
You will need Ice Cream with Syrup x10 (can be obtained from mobs) and you will automatically recive a Power Chest .What can you obtain randomly from Power Chest ? Well, let's find out!
Enchant Item x2
Reinforce Item x1
Blessing Scroll x1
Zen Bean x2
Blessing Marble x1
Stone Handbook x1
Khan x1 - Valid for 30 days
Ice Cream x1
Piercing Strike x1
Critical Strike x1
Dragon God Life x1
Dragon God Attack x1
Dragon God Intelligence x1
Dragon God Defence x1
Desert Warrior (Black, M) x1 - Valid for 30 days
Desert Warrior (Black, F) x1 - Valid for 30 days
Black Turban (M) x1 - Valid for 30 days
Black Turban (F) x1 - Valid for 30 days
Bernie x1 - Valid for 14 days
Red Potion x5
Blue Potion x5Best regards,
Okami -
-
-
Last changes:
1) The fisherman was slightly improved, he received a little protection against the famous fishboot hack.
2) The bug in the DT for the keys has been fixed ... from now on you can do the DT because there will be no more problems.
3) In v3, the dmg of the 10k mobiles has been fixed, they now have normal dmg.
4) Map1 (blue, red, yellow) have been slightly arranged, from now on you will find the alchemist near the general store.
5) The energy system was implemented, including the one for making energy fragments. You can find it at the alchemist.
6) When you login for the first time (available for already created characters also), you will get a new mission 'Free Mount', go to Stable Boy and talk with him;
7) A new mount been implemented, available for 14 days.
8 ) Guild comment have now a new layer of protection anti flood.
9) Green/Purple potion can be used now 1 then if you click them a message will display - cannot use until the effect it's done also to avoid accidentally clicks.
10) Clam been removed from Fisherman.
11) Quest loading time is more faster now.
12) From now, all killed mobs will dissapear after 2 seconds to avoid lag while farm or leveling up.
-
-
-
To the #top #metin2 baby
-
I was 100% sure about it, I think also there are exploits for vote, some server are getting crazy after few hours and that's impossible if you compare the number of players online on that server and numbers counted for vote
Ancient2 - Oldschool server (international).
in Private Servers Archive
Posted · Edited by Metin2 Dev
Core X - External 2 Internal
Website: https://ancient2.com
Discord: https://discord.gg/NtJXbzu
Server start 01.12.2020 at 18:00 EEST.
This server is pvm hard classic and it's like metin2.us at the end of 2008.
The server presentation it's not in the final state and doesn't represent the final version of the game, presentation realised by exo.
Last update: 02.02.2021.