Jump to content

rawn3cr0

Member
  • Posts

    103
  • Joined

  • Last visited

  • Feedback

    0%

Everything posted by rawn3cr0

  1. Wow, nice job. Also old but gold xD Can you upload client please?
  2. 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; } }
  3. Search for header 86 and see what system cause this handshake. Maybe you don;t have same packets client/server (packet.h ....)
  4. What does "I had multiple issues with many hosts" mean? Can you give more details about the problems?
  5. 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.
  6. 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
  7. 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;
  8. 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.
  9. 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.
  10. 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!
  11. 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; } }
  12. 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.
  13. 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.
  14. 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
  15. 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
  16. 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;
  17. The effect / sparkle on the weapons does not disappear when I disengage them. Only if I take off the armor do the effects disappear. I think the solution is in InstanceBase.cpp link
  18. Quest for seal ? And this sistem can be made with bonuses?
  19. I have same problem .... edit: Effect not show...
  20. 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); }
  21. In Ken offlineshop db refresh instantly. How i can make to great shop same?
×
×
  • 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.