Jump to content

OkamiRo

Member
  • Posts

    81
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by OkamiRo

  1. Websitehttps://ancient2.com
    Discordhttps://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.

    JaDVmHH.jpg

    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.

  2. 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

     

  3. 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).

     

  4. 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."));
    }

     

  5. 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
    JqNEhJ8.png

    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


    Br0piU8.png

    In the Upgrades window you can obtain items with yang, seeds or fragments.
    hztmYb0.png

    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.
    VvRmLoq.png

    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.
    8nB0Tq8.png

    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.


    Tybo93E.png

    uzqh6qA.png


    Make sure your client is runing version 0.0.2 for this update, to avoid visual bug and client crash.

  6. Last changes:
    Fencing Pamphlet is now stackable.
    Power Chest is no stackable.

    Playtime text changed for a better aspect, instead of xDays xHours xMinutes.

    naGSGAF.png

    Choose server interface get few colors, for a better design.

    iplaacs.png

    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).

    s6TfPGo.png

  7. Fk8t4hF.png

    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 ddeIa5e.png x10 (can be obtained from mobs) and you will automatically recive a Power Chest ZRZ0J70.png.

    What can you obtain randomly from Power Chest ZRZ0J70.png ? Well, let's find out!
    Enchant Item fEibPkI.png x2
    Reinforce Item 6r0pQxX.png x1
    Blessing Scroll BWJqw15.png x1
    Zen Bean yC28o8P.png x2
    Blessing Marble 0iRv6nU.png x1
    Stone Handbook ZRyonKj.png x1
    Khan LkMDdPj.png x1 - Valid for 30 days
    Ice Cream FQ0bgRj.png x1
    Piercing Strike O4xWxOb.png x1
    Critical Strike LBDJbOT.png x1
    Dragon God Life yGns4Jx.png x1
    Dragon God Attack yGns4Jx.png x1
    Dragon God Intelligence yGns4Jx.png x1
    Dragon God Defence yGns4Jx.png x1
    Desert Warrior (Black, M) YcI78Xl.png x1 - Valid for 30 days
    Desert Warrior (Black, F) Yah7nyf.png x1 - Valid for 30 days
    Black Turban (M) 7ydh8IT.png x1 - Valid for 30 days
    Black Turban (F) eGrNjBk.png x1 - Valid for 30 days
    Bernie 71233.png x1 - Valid for 14 days
    Red Potion dZKhrpW.png x5
    Blue Potion xxVMnMN.png x5

    Best regards,
    Okami

  8. 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.

×
×
  • 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.