Jump to content

rawn3cr0

Member
  • Posts

    103
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by rawn3cr0

  1. I installed skill over P. I tried to assign this skill a different aura color than the normal one.

    EX: M-G-P normal aura skill  / E = red aura skill moded

    I tried to make a loop, but only I can see it, the other players can't see it. How could I solve it?

    Code:

    void CInstanceBase::__Warrior_SetGeomgyeongAffect(bool isVisible)
    {
        if (isVisible)
        {
            if (IsWearingDress())
                return;
    
            if (m_kWarrior.m_dwGeomgyeongEffect)
                __DetachEffect(m_kWarrior.m_dwGeomgyeongEffect);
    
            m_GraphicThingInstance.SetReachScale(1.5f);
            if (m_GraphicThingInstance.IsTwoHandMode())
            {
                DWORD dwSkillGrade = 0, dwSlotIndex = 0;
                if (CPythonPlayer::Instance().GetSkillSlotIndex(4, &dwSlotIndex))
                {
                    if (dwSlotIndex < SKILL_MAX_NUM)
                    {
                        dwSkillGrade = CPythonPlayer::Instance().GetSkillGrade(dwSlotIndex);
                        if (dwSkillGrade == 4)
                            m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+51);    // Skill over P 2hands loop
                        else
                            m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+WEAPON_TWOHAND);    // Normal skill
                    }
                }        
            }
            else
            {
                DWORD dwSkillGrade = 0, dwSlotIndex = 0;
                if (CPythonPlayer::Instance().GetSkillSlotIndex(4, &dwSlotIndex))
                {
                    if (dwSlotIndex < SKILL_MAX_NUM)
                    {
                        dwSkillGrade = CPythonPlayer::Instance().GetSkillGrade(dwSlotIndex);
                        if (dwSkillGrade == 4)
                            m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+50);    // Skill over P 1hand loop
                        else
                            m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+WEAPON_ONEHAND);    // Normal skill
                    }
                }    
            }
        }
        else
        {
            m_GraphicThingInstance.SetReachScale(1.0f);
    
            __DetachEffect(m_kWarrior.m_dwGeomgyeongEffect);
            m_kWarrior.m_dwGeomgyeongEffect=0;
        }
    }

     

    • Metin2 Dev 1
  2. New scam aeldra read my mind xD

    .jpg

    My opinion is that it is not the original Aeldra, now all servers look the same. Aeldra always comes with something special in gameplay, which this server does not inspire me.

  3. If someone have nothing to do and want to help me:

    I need a dungeon quest ( universal ) to use for multiple dungeons (Beran / Nemere / Razador / Alastor ...)

    # I want dungeon to work for single player and party group

    # I want to use regen files ( mob.txt / metin.txt / boss.txt )

    # Need 30 minutes to complete dungeon, after this time warp all in town.

    # Need 3 levels: - 1) Kill all mobs (ex: 5 mobs )

                                - 2) Kill all metin stones (ex: 3mobs )

                                - 3) Kill boss

    # After dungeon is done i need a cooldown (ex: 10 minutes)

     

    I maked something similar with a dungeon quest + chatgpt and some help from camillo but im not sure is good enought:

    I have this error ( 

    Save: quest::PC::Save : cannot find . in FlagMap

    ) with this quest and d.notice is not showing...:

    quest DragonLair_dungeon begin
    	state start begin
            when 20090.chat."Dungeon RUN 3 -0" with pc.get_map_index() == 73 begin
                if pc.get_level() < 75 then
                    say_title("DR:")
                    say("[ENTER]Nivelul tau este prea scazut")
                elseif pc.get_level() > 127 then
                    say_title("DR:")
                    say("[ENTER]Nivelul tau este prea mare")
    --[Camilo's code]
    			elseif pc.getqf("last_exit_time") > get_time() then 
    				say_title("DR:")
    				local wait_time = pc.getqf("last_exit_time")-get_time()
    				say(string.format("Wait time:%s", get_time_format(wait_time)))
    			elseif party.is_in_dungeon() then
    				say_title("DR:")
    				say("Party is in dungeon now")
    			elseif not party.is_map_member_flag_lt("last_exit_time" , get_time()) then
    				say_title("DR:")
    				say("Someone has to wait cooltime")
    			else
    				if party.is_party() then
    					if party.is_leader() then
    						d.new_jump_party(150, 8435, 10668) --no 00
    						DragonLair_dungeon.createDungeon() --new line
    					else
    						say("You are not leader group")
    					end
    					else
    						d.new_jump(150, 843500, 1066800)-- Teleport pe harta ( Dungeon Map )
    						DragonLair_dungeon.createDungeon() --new line
    					end
    --[Camilo's code]
    				server_timer("timelimit_dungeon_exit", 300, d.get_map_index()) -- Seteaza un timer de 1 minut pentru a termina temnita    
    			end
    		end	
    
    --[STAGE 1] Inceput
    
    
    		when login or enter with DragonLair_dungeon.isInDungeon(150) begin-- Când jucatorul se conecteaza ?i se afla pe indexul har?ii temni?ei
    			d.set_warp_location(73, 2418, 12750)--Se seteaza locatia
    		end
    
    		when 8031.kill or 8032.kill or 8033.kill or 8034.kill with d.getf("DragonLair_stage01") == 1 begin-- Declan?atorul de ucidere a fost interogat cu semnalizarea misiunii
    			local count = d.getf("kill_counter01") -1-- Variabila setata sa numere ?i scazând -1 din a treia
    			d.setf("kill_counter01", count)-- Questflag pentru numarare pe misiune
    			if count >= 1 then-- Întreba?i daca valoarea numarului este mai mare decât 1
    				d.notice("Ramas: "..count.."")-- Ie?ire text calculata cu valoarea curenta -1
    			elseif count == 0 then-- este contorul 0
    				d.notice("Sarcina 1 finalizata.")-- Ie?ire ca a?i finalizat nivelul
    				d.setf("DragonLair_stage02", 1)--Indicatorul de cautare nivelul 2 setat pentru interogare
    				d.setf("kill_counter02", 1)--Contor setat cu valoarea 100
    				d.regen_file("data/dungeon/dragon_lair/boss.txt")--Regenfile [STAGE 2]
    			end
    		end
    --[STAGE 1] Sfarsit
    
    -- [STAGE 2] Inceput
    		when 2493.kill with d.getf("DragonLair_stage02") == 1 begin
    			local count = d.getf("DragonLair_stage02") -1
    			d.setf("kill_counter02", count)
    			if count >= 1 then
    				d.notice("Ramas: "..count.."")
    			elseif count == 0 then
    				d.notice("Sarcina 2 finalizata.")
    				server_timer("end_dungeon_exit", 20 , d.get_map_index())--Cateva secunde pentru iesire
    			end
    			
    			d.setqf("last_exit_time" , get_time()+60*10) --[Camilo's code] 10 minutes
    			
    		end
    --[STAGE 2] Sfarsit
    
    
    
    -- Functie terminare limita de timp dungeon
    		when timelimit_dungeon_exit.server_timer begin
    			if d.select(get_server_timer_arg()) then
    				DragonLair_dungeon.clearDungeon()
    				d.exit_all()
    			end
    		end
    
    -- Functie iesire terminare dungeon
    		when end_dungeon_exit.server_timer begin
    			if d.select(get_server_timer_arg()) then
    				DragonLair_dungeon.clearDungeon()
    				d.exit_all()
    			end
    		end
    
    -- Verificare de securitate la deconectare
    		when logout begin
    			d.set_warp_location(73, 2418, 12750)
    			if DragonLair_dungeon.isInDungeon() then
    				DragonLair_dungeon.clearDungeon()
    			end
    			
    		end
    
    	end
    
    -- FUNCTIONS BEGIN
    	state __FUNCTIONS__ begin
    		function isInDungeon()
    			return pc.get_map_index() >= (150 * 10000) and pc.get_map_index() < ((150+1) * 10000)-- Calculul indexului har?ii pentru interogarea de securitate
    		end
    		
    		function clearDungeon()
    			d.setf("DragonLair_stage01", 0)
    			d.setf("DragonLair_stage02", 0)
    			d.kill_all()
    			d.clear_regen()
    			d.clear_regen()
    			clear_server_timer("end_dungeon_exit", get_server_timer_arg())
    		end
    		
    		
    
    		function createDungeon()
    			d.regen_file("data/dungeon/dragon_lair/metins.txt")--Regenfile [STAGE 1]
    			d.notice("Distruge toate pietrele de metin.")-- Text
    			d.setf("DragonLair_stage01", 1)--Setul de nivel 1 pentru interogare
    			d.setf("kill_counter01", 4)--Contor setat cu valoarea 3
    		end
    		
    		
    		
    	end
    -- FUNCTIONS END
    
    end--Quest

     

  4. EDIT: Solved. If it doesn't work with POISON in SetImmuneFlag go in char_resist.cpp > void CHARACTER::AttackedByPoison(LPCHARACTER pkAttacker) uncomment or put 

    	if (IsImmune(IMMUNE_POISON))
    		return;

     

    12 hours ago, rawn3cr0 said:

    Everything else works perfectly but metin stone will have the green bar even if they can't be poisoned.

    How i can fix this? I put POISON on SetImmuneFlag but nothing.

    .jpg

     

  5. On 5/4/2023 at 6:14 AM, RobinHoodye said:

    i faunded a solution with ip in sources https://just4metin.ro/sursa/source-fix-kick-dupa-selectare-caracter-40k-t51936.html?hilit=kick selectare caracter from this post but no know it's 100% working or no ?? someone have idee working? 

    Yes. Is working. This is writed by me. Put all ports from core in portfwording table from router. And is working.

    Configure freebsd with internal ip from router (ex: 192.168.0.104) and in cores config at CONNECTION_IP: external ip (ex: 109.197.77.163) or if you use directly in source without update for CONNECTION_IP ex: memcpy(p.szIP, "109.197.77.163", 16);

    In client at ip in serverinfo.py put external ip ex: 109.197.77.163

    Done!

  6. If I put an object for example at 100k, I look for it, I offer to buy it but I don't accept and then I change the price of the object to 5kk and I agree to buy it, he will buy it at the price of 5kk.

    I want to do something but I don't know, a kind of price check to not buy if is not same price...

    I use Mali's Official Private Shop Search

    Video and code down:

    void CShopManager::ShopSearchProcess(LPCHARACTER ch, const TPacketCGPrivateShopSearch* p)
    {
    	if (ch == NULL || ch->GetDesc() == NULL || p == NULL)
    		return;
    
    	if (ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen())
    	{
    		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]31"));
    		return;
    	}
    
    	TEMP_BUFFER buf;
    
    	for (std::map<DWORD, CShop*>::const_iterator it = m_map_pkShopByPC.begin(); it != m_map_pkShopByPC.end(); ++it)
    	{
    		CShop* tShopTable = it->second;
    		if (tShopTable == NULL || tShopTable->LockStatus())
    			continue;
    
    		LPCHARACTER GetOwner = tShopTable->GetShopOwner();
    		if (GetOwner == NULL || ch == GetOwner)
    			continue;
    
    		const std::vector<CShop::SHOP_ITEM>& vItemVec = tShopTable->GetItemVector();
    		for (std::vector<CShop::SHOP_ITEM>::const_iterator ShopIter = vItemVec.begin(); ShopIter != vItemVec.end(); ++ShopIter)
    		{
    			LPITEM item = ShopIter->pkItem;
    			if (item == NULL)
    				continue;
    
    			/*First n character equals(case insensitive)*/
    			if (strncasecmp(item->GetName(), p->szItemName, strlen(p->szItemName)))
    				continue;
    
    			if ((p->iMinRefine <= item->GetRefineLevel() && p->iMaxRefine >= item->GetRefineLevel()) == false)
    				continue;
    
    			if ((p->iMinLevel <= item->GetLevelLimit() && p->iMaxLevel >= item->GetLevelLimit()) == false)
    				continue;
    
    			if ((p->iMinGold <= ShopIter->price && p->iMaxGold >= ShopIter->price) == false)
    				continue;
    
    			if (p->bMaskType != ITEM_NONE && p->bMaskType != item->GetType()) // ITEM_NONE: All Categories
    				continue;
    
    			if (p->iMaskSub != -1 && p->iMaskSub != item->GetSubType()) // -1: No SubType Check
    				continue;
    
    			switch (p->bJob)
    			{
    			case JOB_WARRIOR:
    				if (item->GetAntiFlag() & ITEM_ANTIFLAG_WARRIOR)
    					continue;
    				break;
    
    			case JOB_ASSASSIN:
    				if (item->GetAntiFlag() & ITEM_ANTIFLAG_ASSASSIN)
    					continue;
    				break;
    
    			case JOB_SHAMAN:
    				if (item->GetAntiFlag() & ITEM_ANTIFLAG_SHAMAN)
    					continue;
    				break;
    
    			case JOB_SURA:
    				if (item->GetAntiFlag() & ITEM_ANTIFLAG_SURA)
    					continue;
    				break;
    
    			}
    
    			TPacketGCPrivateShopSearchItem pack2;
    			pack2.item.vnum = ShopIter->vnum;
    			pack2.item.price = ShopIter->price;
    			pack2.item.count = ShopIter->count;
    
    			pack2.item.display_pos = static_cast<BYTE>(std::distance(vItemVec.begin(), ShopIter));
    
                if (item->GetOwner())
                    pack2.dwShopPID = item->GetOwner()->GetVID();
                else
                    pack2.dwShopPID = 0;
    
    			std::memcpy(&pack2.szSellerName, GetOwner->GetName(), sizeof(pack2.szSellerName));
    			std::memcpy(&pack2.item.alSockets, item->GetSockets(), sizeof(pack2.item.alSockets));
    			std::memcpy(&pack2.item.aAttr, item->GetAttributes(), sizeof(pack2.item.aAttr));
    
    			buf.write(&pack2, sizeof(pack2));
    		}
    	}
    
    	if (buf.size() <= 0)
    		return;
    
    	TPacketGCPrivateShopSearch pack;
    	pack.header = HEADER_GC_PRIVATE_SHOP_SEARCH;
    	pack.size = static_cast<WORD>(sizeof(pack) + buf.size());
    	ch->GetDesc()->BufferedPacket(&pack, sizeof(pack));
    	ch->GetDesc()->Packet(buf.read_peek(), buf.size());
    }
    
    #include "unique_item.h"
    #include "target.h"
    void CShopManager::ShopSearchBuy(LPCHARACTER ch, const TPacketCGPrivateShopSearchBuyItem* p)
    {
        if (ch == NULL || ch->GetDesc() == NULL || p == NULL)
            return;
    
        int32_t shopVid = p->dwShopPID;
    
        if (ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]31"));
            return;
        }
    
        LPCHARACTER ShopCH = CHARACTER_MANAGER::instance().Find(shopVid);
    
        if (ShopCH == NULL)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]753"));
            return;
        }
    
        if (ch == ShopCH) // what?
            return;
    
        CShop* pkShop = ShopCH->GetMyShop();
    
        if (pkShop == NULL || pkShop->IsPCShop() == false)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]753"));
            return;
        }
    
        const BYTE bState = ch->GetPrivateShopSearchState();
        switch (bState)
        {
        case SHOP_SEARCH_LOOKING:
        {
            if (ch->CountSpecifyItem(PRIVATE_SHOP_SEARCH_LOOKING_GLASS) == 0)
            {
                const TItemTable* GlassTable = ITEM_MANAGER::instance().GetTable(PRIVATE_SHOP_SEARCH_LOOKING_GLASS);
                if (GlassTable)
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]754"), GlassTable->szLocaleName);
                return;
            }
    
            if (ch->GetMapIndex() != ShopCH->GetMapIndex())
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]755"));
                return;
            }
    
    		if (pkShop->LockStatus())
    		{
    			ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]948"));
    			return;
    		}
    
            const DWORD dwSellerVID(ShopCH->GetVID());
            if (CTargetManager::instance().GetTargetInfo(ch->GetPlayerID(), TARGET_TYPE_VID_SHOP_SEARCH, dwSellerVID))
                CTargetManager::instance().DeleteTarget(ch->GetPlayerID(), SHOP_SEARCH_INDEX, "__SHOPSEARCH_TARGET__");
    
            CTargetManager::Instance().CreateTarget(ch->GetPlayerID(), SHOP_SEARCH_INDEX, "__SHOPSEARCH_TARGET__", TARGET_TYPE_VID_SHOP_SEARCH, dwSellerVID, 0, ch->GetMapIndex(), LC_TEXT("[LC]949"), 1);
    
            if (CTargetManager::instance().GetTargetInfo(ch->GetPlayerID(), TARGET_TYPE_VID_SHOP_SEARCH, dwSellerVID))
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]756"));
            break;
        }
    
        case SHOP_SEARCH_TRADING:
        {
            if (ch->CountSpecifyItem(PRIVATE_SHOP_SEARCH_TRADING_GLASS) == 0)
            {
                const TItemTable* GlassTable = ITEM_MANAGER::instance().GetTable(PRIVATE_SHOP_SEARCH_TRADING_GLASS);
                if (GlassTable)
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]754"), GlassTable->szLocaleName);
                return;
            }
    
    		if (pkShop->LockStatus())
    		{
    			ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]948"));
    			return;
    		}
    
            ch->SetMyShopTime();
    		
    		
    		
    		
    		const std::vector<CShop::SHOP_ITEM>& vItemVec = pkShop->GetItemVector();
    		const CShop::SHOP_ITEM& item = vItemVec[p->bPos];
    		
    		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Pret magazin: %u"), item.price);
    // Here need something like 
          // if (item.price != shop_search_view_price_but_i_dont_know)
          /////
    	
    		
    		
    		
            int ret = pkShop->Buy(ch, p->bPos, true);
    
            if (SHOP_SUBHEADER_GC_OK != ret)
            {
                TPacketGCShop pack;
                pack.header = HEADER_GC_SHOP;
                pack.subheader = static_cast<BYTE>(ret);
                pack.size = sizeof(TPacketGCShop);
                ch->GetDesc()->Packet(&pack, sizeof(pack));
            }
            else
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]757"));
    
            break;
        }
        default:
            sys_err("ShopSearchBuy ch(%s) wrong state(%d)", ch->GetName(), bState);
            break;
        }
    }

     

  7. I installed ClientLocaleString. THIS

    I did all the translation lines manually. ( 1 week every day 8hours of translating )

    But I have some Problems with:

    1) Horse name: How i can translate ?-->  m_chHorse->m_stName += LC_TEXT("님의 말- Horse");

    void CHARACTER::HorseSummon(bool bSummon, bool bFromFar, DWORD dwVnum, const char* pPetName)
    {
    	if ( bSummon )
    	{
    		//NOTE : summon했는데 이미 horse가 있으면 아무것도 안한다.
    		if( m_chHorse != NULL )
    			return;
    
    		if (GetHorseLevel() <= 0)
    			return;
    
    		// 무언가를 타고 있다면 실패
    		if (IsRiding())
    			return;
    
    		sys_log(0, "HorseSummon : %s lv:%d bSummon:%d fromFar:%d", GetName(), GetLevel(), bSummon, bFromFar);
    
    		long x = GetX();
    		long y = GetY();
    
    		if (GetHorseHealth() <= 0)
    			bFromFar = false;
    
    		if (bFromFar)
    		{
    			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);
    		}
    
    		m_chHorse = CHARACTER_MANAGER::instance().SpawnMob(
    				(0 == dwVnum) ? GetMyHorseVnum() : dwVnum, 
    				GetMapIndex(), 
    				x, y,
    				GetZ(), false, (int)(GetRotation()+180), false);
    
    		if (!m_chHorse)
    		{
    			LocaleChatPacket(CHAT_TYPE_INFO, 98, " ");
    			return;
    		}
    
    		if (GetHorseHealth() <= 0)
    		{
    			// 죽은거처럼 있게 하는 처리
    			m_chHorse->SetPosition(POS_DEAD);
    
    			// 일정시간있다 사라지게 하자.
    			char_event_info* info = AllocEventInfo<char_event_info>();
    			info->ch = this;
    			m_chHorse->m_pkDeadEvent = event_create(horse_dead_event, info, PASSES_PER_SEC(60));
    		}
    
    		m_chHorse->SetLevel(GetHorseLevel());
    
    		const char* pHorseName = CHorseNameManager::instance().GetHorseName(GetPlayerID());
    
    		if ( pHorseName != NULL && strlen(pHorseName) != 0 )
    		{
    			m_chHorse->m_stName = pHorseName;
    		}
    		else
    		{
    			m_chHorse->m_stName = GetName();
    			m_chHorse->m_stName += LC_TEXT("님의 말");
    		}
    
    		if (!m_chHorse->Show(GetMapIndex(), x, y, GetZ()))
    		{
    			M2_DESTROY_CHARACTER(m_chHorse);
    			sys_err("cannot show monster");
    			m_chHorse = NULL;
    			return;
    		}
    
    		if ((GetHorseHealth() <= 0))
    		{
    			TPacketGCDead pack;
    			pack.header	= HEADER_GC_DEAD;
    			pack.vid    = m_chHorse->GetVID();
    			PacketAround(&pack, sizeof(pack));
    		}
    
    		m_chHorse->SetRider(this);
    	}
    	else
    	{
    		if (!m_chHorse)
    			return;
    
    		LPCHARACTER chHorse = m_chHorse;
    
    		chHorse->SetRider(NULL); // m_chHorse assign to NULL
    
    		if (!bFromFar)
    		{
    			M2_DESTROY_CHARACTER(chHorse);
    		}
    		else
    		{
    			// 멀어지면서 사라지는 처리 하기
    			chHorse->SetNowWalking(false);
    			float fx, fy;
    			chHorse->SetRotation(GetDegreeFromPositionXY(chHorse->GetX(), chHorse->GetY(), GetX(), GetY())+180);
    			GetDeltaByDegree(chHorse->GetRotation(), 3500, &fx, &fy);
    			chHorse->Goto((long)(chHorse->GetX()+fx), (long) (chHorse->GetY()+fy));
    			chHorse->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0);
    		}
    
    		m_chHorse = NULL;
    	}
    }

    2) Dice in party use ChatPacketToAllMember 

    How i can translate ?--> ch->GetParty()->ChatPacketToAllMember(CHAT_TYPE_INFO, LC_TEXT("%s a aruncat zarurile.El/Ea a aruncat %d (%d-%d)."), ch->GetName(), n, start, end);

    void CParty::ChatPacketToAllMember(BYTE type, const char* format, ...)
    {
    	char chatbuf[CHAT_MAX_LEN + 1];
    	va_list args;
    
    	va_start(args, format);
    	vsnprintf(chatbuf, sizeof(chatbuf), format, args);
    	va_end(args);
    
    	TMemberMap::iterator it;
    
    	for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it)
    	{
    		TMember & rMember = it->second;
    
    		if (rMember.pCharacter)
    		{
    			if (rMember.pCharacter->GetDesc())
    			{
    				rMember.pCharacter->ChatPacket(type, "%s", chatbuf);
    			}
    		}
    	}
    }

    3) PvP Arena use SendChatPacketToObserver

    How i can translate ?--> pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("대련 상대가 사라져 대련을 종료합니다."));

    void CArena::SendChatPacketToObserver(BYTE type, const char * format, ...)
    {
    
    	char chatbuf[CHAT_MAX_LEN + 1];
    	va_list args;
    
    	va_start(args, format);
    	vsnprintf(chatbuf, sizeof(chatbuf), format, args);
    	va_end(args);
    
    	itertype(m_mapObserver) iter = m_mapObserver.begin();
    
    	for (; iter != m_mapObserver.end(); iter++)
    	{
    		LPCHARACTER pChar = iter->second;
    
    		if (pChar != NULL)
    		{
    			if (pChar->GetDesc() != NULL)
    			{
    				pChar->ChatPacket(type, chatbuf);
    			}
    		}
    	}
    
    }

    This is all.

    I don't know what changes need to be made to go with LocaleChatPacket

    I just don't want to know that I worked for a week for nothing.

    Respectfully. And thanks for the help.
    All the best.

  8. I edited this for Arena PvP

    void CArena::SendChatPacketToObserver(BYTE type, DWORD dwIndex, const char * format, ...)
    {
    
    	char chatbuf[CHAT_MAX_LEN + 1];
    	va_list args;
    
    	va_start(args, format);
    	vsnprintf(chatbuf, sizeof(chatbuf), format, args);
    	va_end(args);
    
    	itertype(m_mapObserver) iter = m_mapObserver.begin();
    
    	for (; iter != m_mapObserver.end(); iter++)
    	{
    		LPCHARACTER pChar = iter->second;
    
    		if (pChar != NULL)
    		{
    			if (pChar->GetDesc() != NULL)
    			{
    				pChar->LocaleChatPacket(type, dwIndex, chatbuf);
    			}
    		}
    	}
    
    }

    Is working but not show %s = player  Ex:  PlayerX win this arena.

    And show like this:   ☐ win this arena.

     

  9. Update. I make a timer with chatgpt xD and is working. And i change some..

    I still have to do:

    A) I want to have a waiting time after the dungeon is finished. (Cooldown)

    B) I want it to be possible to enter both as a group and solo.

    Thank you and much respect.

    quest DragonLair_dungeon begin
    	state start begin
    		when 20090.chat."Dungeon RUN" with pc.get_map_index() == 73 begin
    			if pc.get_level() < 75 then -- Daca jucatorul este sub nivel 15
    				say_title("DR:")--Text cu nume NPC
    				say("[ENTER]Nivelul tau este prea scazut")-- Text cu paragraf
    			elseif pc.get_level() > 150 then--Daca jucatorul este peste nivel 75
    				say_title("DR:")--Text cu nume NPC
    				say("[ENTER]Nivelul tau este prea mare")-- Text cu paragraf
    			else-- Daca jucatorul are inter lv 15 si lv 75 ( alles andere )
    				d.new_jump(150, 843500, 1066800)-- Teleport pe harta ( Dungeon Map )
    				server_timer("timelimit_dungeon_exit", 60, d.get_map_index()) -- Seteaza un timer de 1 minut pentru a termina temnita
    				
    			end
    		end
    
    --[STAGE 1] Inceput
    		when login or enter with DragonLair_dungeon.isInDungeon(150) begin-- Când jucatorul se conecteaza ?i se afla pe indexul har?ii temni?ei
    			d.set_warp_location(73, 2418, 12750)--Se seteaza locatia
    			d.regen_file("data/dungeon/dragon_lair/metins.txt")--Regenfile [STAGE 1]
    			d.notice("Distruge toate pietrele de metin.")-- Text
    			d.setf("DragonLair_stage01", 1)--Setul de nivel 1 pentru interogare
    			d.setf("kill_counter01", 4)--Contor setat cu valoarea 3
    		end
    
    		when 8031.kill or 8032.kill or 8033.kill or 8034.kill with d.getf("DragonLair_stage01") == 1 begin-- Declan?atorul de ucidere a fost interogat cu semnalizarea misiunii
    			local count = d.getf("kill_counter01") -1-- Variabila setata sa numere ?i scazând -1 din a treia
    			d.setf("kill_counter01", count)-- Questflag pentru numarare pe misiune
    			if count >= 1 then-- Întreba?i daca valoarea numarului este mai mare decât 1
    				d.notice("Ramas: "..count.."")-- Ie?ire text calculata cu valoarea curenta -1
    			elseif count == 0 then-- este contorul 0
    				d.notice("Sarcina 1 finalizata.")-- Ie?ire ca a?i finalizat nivelul
    				d.setf("DragonLair_stage02", 1)--Indicatorul de cautare nivelul 2 setat pentru interogare
    				d.setf("kill_counter02", 1)--Contor setat cu valoarea 100
    				d.regen_file("data/dungeon/dragon_lair/boss.txt")--Regenfile [STAGE 2]
    			end
    		end
    --[STAGE 1] Sfarsit
    
    -- [STAGE 2] Inceput
    		when 2493.kill with d.getf("DragonLair_stage02") == 1 begin
    			local count = d.getf("DragonLair_stage02") -1
    			d.setf("kill_counter02", count)
    			if count >= 1 then
    				d.notice("Ramas: "..count.."")
    			elseif count == 0 then
    				d.notice("Sarcina 2 finalizata.")
    				server_timer("end_dungeon_exit", 20 , d.get_map_index())--Cateva secunde pentru iesire
    			end
    		end
    --[STAGE 2] Sfarsit
    
    -- Functie terminare limita de timp dungeon
    		when timelimit_dungeon_exit.server_timer begin
    			if d.select(get_server_timer_arg()) then
    				DragonLair_dungeon.clearDungeon()
    				d.exit_all()
    			end
    		end
    
    -- Functie iesire terminare dungeon
    		when end_dungeon_exit.server_timer begin
    			if d.select(get_server_timer_arg()) then
    				DragonLair_dungeon.clearDungeon()
    				d.exit_all()
    			end
    		end
    
    -- Verificare de securitate la deconectare
    		when logout begin
    			if DragonLair_dungeon.isInDungeon() then
    				DragonLair_dungeon.clearDungeon()
    			end
    		end
    
    
    	end
    
    -- FUNCTIONS BEGIN
    	state __FUNCTIONS__ begin
    		function isInDungeon(idx)
    			return pc.get_map_index() >= (idx * 10000) and pc.get_map_index() < ((idx+1) * 10000)-- Calculul indexului har?ii pentru interogarea de securitate
    		end
    		function clearDungeon()
    			d.setf("DragonLair_stage01", 0)
    			d.setf("DragonLair_stage02", 0)
    			d.kill_all()
    			d.clear_regen()
    			d.clear_regen()
    			clear_server_timer("end_dungeon_exit", get_server_timer_arg())
    		end
    	end
    -- FUNCTIONS END
    
    end--Quest

     

  10. Hi. After a period in which I cleaned up the server and put in two months of work, I reached dungeons. For the dragon's dungeon, none of my files worked.

    I downloaded a simple file from the internet which I modified and it's working perfectly.

    1) I want to add a TIME for when the dungeon should end and I don't know how to do that.

    2) I want to have a waiting time after the dungeon is finished.

    3) I want it to be possible to enter both as a group and solo.

    Here is my file. Thank you and much respect. 🙂

    quest orktal_dungeon begin
    	state start begin
    		when 20090.chat."Dungeon RUN" with pc.get_map_index() == 73 begin
    			if pc.get_level() < 75 then -- Daca jucatorul este sub nivel 15
    				say_title("DR:")--Text cu nume NPC
    				say("[ENTER]Nivelul tau este prea scazut")-- Text cu paragraf
    			elseif pc.get_level() > 150 then--Daca jucatorul este peste nivel 75
    				say_title("DR:")--Text cu nume NPC
    				say("[ENTER]Nivelul tau este prea mare")-- Text cu paragraf
    			else-- Daca jucatorul are inter lv 15 si lv 75 ( alles andere )
    				d.new_jump(150, 843500, 1066800)-- Teleport pe harta ( Dungeon Map )
    			end
    		end
    
    --[STAGE 1] Inceput
    		when login or enter with orktal_dungeon.isInDungeon(150) begin-- Când jucatorul se conecteaza ?i se afla pe indexul har?ii temni?ei
    			d.set_warp_location(73, 2418, 12750)--Se seteaza locatia
    			d.regen_file("data/dungeon/dragon_lair/metins.txt")--Regenfile [STAGE 1]
    			d.notice("Distruge toate pietrele de metin.")-- Text
    			d.setf("orktal_stage01", 1)--Setul de nivel 1 pentru interogare
    			d.setf("monster_counter01", 4)--Contor setat cu valoarea 3
    		end
    
    		when 8031.kill or 8032.kill or 8033.kill or 8034.kill with d.getf("orktal_stage01") == 1 begin-- Declan?atorul de ucidere a fost interogat cu semnalizarea misiunii
    			local count = d.getf("monster_counter01") -1-- Variabila setata sa numere ?i scazând -1 din a treia
    			d.setf("monster_counter01", count)-- Questflag pentru numarare pe misiune
    			if count >= 1 then-- Întreba?i daca valoarea numarului este mai mare decât 1
    				d.notice("Ramas: "..count.."")-- Ie?ire text calculata cu valoarea curenta -1
    			elseif count == 0 then-- este contorul 0
    				d.notice("Sarcina 1 finalizata.")-- Ie?ire ca a?i finalizat nivelul
    				d.setf("orktal_stage02", 1)--Indicatorul de cautare nivelul 2 setat pentru interogare
    				d.setf("monster_counter02", 1)--Contor setat cu valoarea 100
    				d.regen_file("data/dungeon/dragon_lair/boss.txt")--Regenfile [STAGE 2]
    			end
    		end
    --[STAGE 1] Sfarsit
    
    
    -- [STAGE 2] Inceput
    		when 2493.kill with d.getf("orktal_stage02") == 1 begin
    			local count = d.getf("orktal_stage02") -1
    			d.setf("monster_counter02", count)
    			if count >= 1 then
    				d.notice("Ramas: "..count.."")
    			elseif count == 0 then
    				d.notice("Sarcina 2 finalizata.")
    				server_timer("orkdungeon_exit", 20 , d.get_map_index())--Cateva secunde pentru iesire
    			end
    		end
    --[STAGE 2] Sfarsit
    
    
    -- Începe Temnita Rush Teleport
    		when orkdungeon_exit.server_timer begin
    			if d.select(get_server_timer_arg()) then
    				orktal_dungeon.clearDungeon()
    				d.exit_all()
    			end
    		end
    -- Temnita Rush Teleport se termina
    
    -- Verificare de securitate la deconectare
    		when logout begin
    			if orktal_dungeon.isInDungeon() then
    				orktal_dungeon.clearDungeon()
    			end
    		end
    -- Sfâr?itul verificarii de securitate
    
    	end--State start
    
    
    
    
    
    -- FUNCTIONS BEGIN
    	state __FUNCTIONS__ begin
    		function isInDungeon(idx)
    			return pc.get_map_index() >= (idx * 10000) and pc.get_map_index() < ((idx+1) * 10000)-- Calculul indexului har?ii pentru interogarea de securitate
    		end
    		function clearDungeon()
    			d.setf("orktal_stage01", 0)
    			d.setf("orktal_stage02", 0)
    			d.kill_all()
    			d.clear_regen()
    			d.clear_regen()
    			clear_server_timer("orkdungeon_exit", get_server_timer_arg())
    		end
    	end
    -- FUNCTIONS END
    
    end--Quest

     

  11. EDIT: Resolved. One function need to pe blaced with { }

    Like this.

    	//Weapon Effect
    	CItemData * pItemData;
    	if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData))
    	{          //FIX_BUG
    		if (CPythonSystem::Instance().IsShowRefineEffect())
    			__GetRefinedEffect(pItemData, dwWeaponRareLv, m_dwCostumEvo);
    	}          //FIX_BUG
    	else
    		__ClearWeaponRefineEffect();
    
    	return true;

     

  12. How i can modify this from:

    /search_in_shops (VNUM)   ex /search_in_shops 189

    in...

    /search_in_shops (VNUM) (ITEM-ID-from shop table)   ex /search_in_shops 189 50

    To not find all items with vnum just one item with specified id.

     

    struct FSearch
    {
    	FSearch(LPCHARACTER ch, int Vnum) : m_ch(ch), itemVnum(Vnum)
    	{
    	}
    	void operator () (LPENTITY ent)
    	{
    		if (ent->IsType(ENTITY_CHARACTER))
    		{
    			LPCHARACTER ch = (LPCHARACTER) ent;
    
    			if (ch->GetRaceNum() !>= 30000 && GetRaceNum() <= 30007) //umutk kaşmir
    				return;
    			char szQuery[1024];
    			sprintf(szQuery,
    			"SELECT * FROM %soffline_shop_item WHERE owner_id = %u AND vnum = %d",
    			get_table_postfix(), ch->GetOfflineShopRealOwner(), itemVnum);
    
    			std::auto_ptr<SQLMsg> pSearchQuery(DBManager::instance().DirectQuery(szQuery));
    
    			if (pSearchQuery->uiSQLErrno != 0) {
    				sys_err("Item Search Query Failed, Error code: %ld", pSearchQuery->uiSQLErrno);
    				return;
    			}
    			if (!pSearchQuery->Get()->uiNumRows){
    				return;
    			}
    			CTargetManager::Instance().CreateTarget(m_ch->GetPlayerID(), 9999, ch->GetName(), 3, ch->GetVID(), 0, m_ch->GetMapIndex(), NULL, 1);
    		}
    	}
    	LPCHARACTER m_ch;
    	int itemVnum;
    };
    
    	
    void COfflineShopManager::SearchInShops(LPCHARACTER ch, int vnum)
    {
    	if (!ch)
    		return;
    	LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
    	if (!pSecMap)
    		return;
    	FSearch f(ch, vnum);
    	pSecMap->for_each(f);
    	ch->SetQuestFlag("item_search.flood_check", get_global_time());
    }
           
                  
    ACMD(do_search_in_shops)
    {
    	char arg1[256];
    	one_argument(argument, arg1, sizeof(arg1));
    
    	int vnum = 0;
    	str_to_number(vnum, arg1);
    
    	int iFloodResult = ch->GetQuestFlag("item_search.flood_check");
    	if (iFloodResult){
    		if (get_global_time() < iFloodResult + 3) {
    			ch->ChatPacket(CHAT_TYPE_INFO, "Cok hizlisin.");
    			return;
    		}
    	}
    
    	COfflineShopManager::Instance().SearchInShops(ch, vnum);
    }

     

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