Jump to content

rawn3cr0

Member
  • Posts

    106
  • Joined

  • Last visited

  • Feedback

    0%

About rawn3cr0

  • Birthday 12/24/1997

Informations

  • Gender
    Male
  • Country
    Romania
  • Nationality
    Romanian

Recent Profile Visitors

2094 profile views

rawn3cr0's Achievements

Rising Star

Rising Star (9/16)

  • Dedicated
  • Reacting Well
  • First Post
  • Collaborator Rare
  • Week One Done

Recent Badges

1

Reputation

  1. I have this but i don't have this bug.. if (!IsEmptyItemGrid(DestCell, item->GetSize(), Cell.cell)) return false; Maybe because of: if (Cell.IsSamePosition(DestCell)) // @fixme196 (check same slot n same window aliases) (05.24/Adapted for overlapping objects: special inventory - inventory and move item if have same slotid SI=I) return false;
  2. I solved. I made a separate function for the sale slot in the special inventory. By default, the slot from the normal inventory was also used. Solved
  3. I'll let the video to talk.. uiQuickSell.py [Hidden Content] uiSpecialStorage.py [Hidden Content]
  4. Wow, nice job. Also old but gold xD Can you upload client please?
  5. 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; } }
      • 1
      • Metin2 Dev
  6. Search for header 86 and see what system cause this handshake. Maybe you don;t have same packets client/server (packet.h ....)
  7. What does "I had multiple issues with many hosts" mean? Can you give more details about the problems?
  8. rawn3cr0

    New Aeldra

    New scam aeldra read my mind xD 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.
  9. 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
  10. 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;
  11. 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.
  12. How can I change the average price to appear in the items in the inventory? For example, put the cursor on an item in the inventory and it will show you the average price that is sold in stores.
  13. 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!
  14. 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; } }
×
×
  • 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.