Hallöchen,
ich habe für ein Projekt ein paar neue/veränderte Questfunktionen erstellt. Ob ihr diese braucht oder nicht ist euch überlassen. Und ob es solche funktionen irgendwo schon gibt, keine ahnung ich habe nicht danach gesucht! Ausser der dead trigger, den gibt es auf einem anderen Forum aber der Vollständigkeit halber schreibe ich den auch noch mal fix mit auf, schad ja nich.
Erklärung:
Funktion | Beschreibung |
---|---|
when dead begin | Damit könnt ihr ein when aufrufen in eurer Quest welche durchlaufen werden soll wenn ihr gestorben seid. |
d.big_notice | das d.notice ist ja bekannt, mit d.big_notice gibt es eine dungeon-notiz in groß. (keine probleme mit server(_loop_)timer) |
d.cmdchat | Mit dieser funktion könnt ihr an alle Spieler einer dungeon ein cmd befehl an den Client der Spieler senden. (keine probleme mit server(_loop_)timer) |
d.jump_solo | Die vorhandene funktion d.jump wurde in leicht abgeänderter funktion kopiert. Grund war das diese funktion einen Spieler teleportiert wenn er nicht in einer Gruppe ist - und wenn er in einer Gruppe ist wird die gesamte Gruppe in den Dungeon teleportiert. Jedenfalls alle in einer Gruppe die sich auf der selben Map befinden. d.jump_solo teleportiert demnach NUR einen einzelnden Spieler |
d.jump_party | Wohl die etwas "unnötigere" funktion weil man theoretisch auch d.jump nehmen könnte, jedoch wirft dieser ein ChatPacket aus wenn man die funktion aufruft wenn man NICHT in einer Gruppe ist. Also nützlich wenn man wirklich NUR Gruppen in den Dungeon hinein lassen will und keine einzelnden Spieler. |
d.give_item_all | Ermöglicht es, jedem im Dungeon ein Item zu geben. |
Zu d.jump_solo und d.jump_party weiß ich nicht ob es da schon eine ymir funktion gegeben hat die theoretisch das gleiche macht, ich habe nicht alle ausprobiert und deshalb einfach was selbst gebastelt für meine zwecke.
C: questmanager.cpp
- // Search:
- m_mapEventName.insert(TEventNameMap::value_type("ride", QUEST_RIDE_EVENT));
- // Add :
- m_mapEventName.insert(TEventNameMap::value_type("dead", QUEST_DEAD_EVENT));
- // Search:
- void CQuestManager::Logout(unsigned int pc)
- {
- [...]
- }
- // Add:
- void CQuestManager::Dead(unsigned int pc)
- {
- PC * pPC;
- if ((pPC = GetPC(pc)))
- {
- if (!CheckQuestLoaded(pPC))
- return;
- m_mapNPC[QUEST_NO_NPC].OnDead(*pPC);
- }
- else
- sys_err("QUEST no such pc id : %d", pc);
- }
C: questnpc.cpp
C: char_battle.cpp
- // Search in function "void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead)":
- ClearSync();
- event_cancel(&m_pkStunEvent);
- if (IsPC())
- {
- // Add :
- quest::CQuestManager::instance().Dead(GetPlayerID());
- // Look like this:
- [...]
- ClearSync();
- event_cancel(&m_pkStunEvent);
- if (IsPC())
- {
- m_dwLastDeadTime = get_dword_time();
- SetKillerMode(false);
- GetDesc()->SetPhase(PHASE_DEAD);
- quest::CQuestManager::instance().Dead(GetPlayerID());
- }
- else
- [...]
C: questlua_dungeon.cpp
- // Search :
- int dungeon_notice(lua_State* L)
- {
- [...]
- }
- // Add:
- int dungeon_big_notice(lua_State* L)
- {
- if (!lua_isstring(L, 1))
- return 0;
- CQuestManager& q = CQuestManager::instance();
- LPDUNGEON pDungeon = q.GetCurrentDungeon();
- if (pDungeon)
- pDungeon->BigNotice(lua_tostring(L, 1));
- return 0;
- }
- int dungeon_cmdchat(lua_State* L)
- {
- if (!lua_isstring(L, 1))
- return 0;
- CQuestManager& q = CQuestManager::instance();
- LPDUNGEON pDungeon = q.GetCurrentDungeon();
- if (pDungeon)
- pDungeon->CmdChat(lua_tostring(L, 1));
- return 0;
- }
- // Search :
- { "notice", dungeon_notice },
- // Add :
- { "big_notice", dungeon_big_notice },
- { "cmdchat", dungeon_cmdchat },
C: dungeon.cpp
- // Search :
- struct FNotice
- {
- [...]
- }
- // Add :
- struct FBigNotice
- {
- FBigNotice(const char * psz) : m_psz(psz)
- {
- }
- void operator() (LPENTITY ent)
- {
- if (ent->IsType(ENTITY_CHARACTER))
- {
- LPCHARACTER ch = (LPCHARACTER) ent;
- ch->ChatPacket(CHAT_TYPE_BIG_NOTICE, "%s", m_psz);
- }
- }
- const char * m_psz;
- };
- struct FCmd
- {
- FCmd(const char * psz) : m_psz(psz)
- {
- }
- void operator() (LPENTITY ent)
- {
- if (ent->IsType(ENTITY_CHARACTER))
- {
- LPCHARACTER ch = (LPCHARACTER) ent;
- ch->ChatPacket(CHAT_TYPE_COMMAND, "%s", m_psz);
- }
- }
- const char * m_psz;
- };
- // Search :
- void CDungeon::Notice(const char* msg)
- {
- [...]
- }
- // Add :
- void CDungeon::BigNotice(const char* msg)
- {
- sys_log(0, "XXX Dungeon CMD %p %s", this, msg);
- LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(m_lMapIndex);
- if (!pMap)
- {
- sys_err("cannot find map by index %d", m_lMapIndex);
- return;
- }
- FBigNotice f(msg);
- pMap->for_each(f);
- }
- void CDungeon::CmdChat(const char* msg)
- {
- sys_log(0, "XXX Dungeon CMD %p %s", this, msg);
- LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(m_lMapIndex);
- if (!pMap)
- {
- sys_err("cannot find map by index %d", m_lMapIndex);
- return;
- }
- FCmd f(msg);
- pMap->for_each(f);
- }
C: questlua_dungeon.cpp
- // Search :
- int dungeon_join(lua_State* L)
- {
- [...]
- }
- // Add :
- int dungeon_join_solo(lua_State* L)
- {
- if (lua_gettop(L) < 1 || !lua_isnumber(L, 1))
- return 0;
- long lMapIndex = (long)lua_tonumber(L, 1);
- LPDUNGEON pDungeon = CDungeonManager::instance().Create(lMapIndex);
- if (!pDungeon)
- return 0;
- LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
- if (!ch->GetParty())
- pDungeon->Join(ch);
- else
- ch->ChatPacket(CHAT_TYPE_INFO, "Du kannst nicht in den Dungeon eintreten während du in einer Gruppe bist."));
- return 0;
- }
- int dungeon_join_party(lua_State* L)
- {
- if (lua_gettop(L) < 1 || !lua_isnumber(L, 1))
- return 0;
- long lMapIndex = (long)lua_tonumber(L, 1);
- LPDUNGEON pDungeon = CDungeonManager::instance().Create(lMapIndex);
- if (!pDungeon)
- return 0;
- LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
- if (ch->GetParty() && ch->GetParty()->GetLeaderPID() == ch->GetPlayerID())
- pDungeon->JoinParty(ch->GetParty());
- else if (ch->GetParty() && ch->GetParty()->GetLeaderPID() != ch->GetPlayerID())
- ch->ChatPacket(CHAT_TYPE_INFO, "Du musst Gruppenleiter sein um den Dungeon zu starten."));
- else if (!ch->GetParty())
- ch->ChatPacket(CHAT_TYPE_INFO, "Du kannst nicht ohne Gruppe in den Dungeon."));
- return 0;
- }
- // Search :
- { "join", dungeon_join },
- // Add :
- { "join_solo", dungeon_join_solo },
- { "join_party", dungeon_join_party },
C: questlua_dungeon.cpp
- // Search :
- void RegisterDungeonFunctionTable()
- // Add above :
- int dungeon_give_item_all(lua_State* L)
- {
- CQuestManager & q = CQuestManager::instance();
- FDungeonGiveItemAll f;
- if (!lua_isstring(L, 1) || !lua_isstring(L, 2))
- {
- sys_err("Invalid Argument");
- }
- f.vnum = (DWORD)lua_tonumber(L, 1);
- f.count = (int)lua_tonumber(L, 2);
- LPDUNGEON pDungeon = q.GetCurrentDungeon();
- if (pDungeon)
- pDungeon->ForEachMember(f);
- return 0;
- }
- // add in "void RegisterDungeonFunctionTable()" :
- { "give_item_all", dungeon_give_item_all },
C: questlua.cpp
C: questpc.cpp
Ich denke ich habe nichts vergessen, wenn doch, sagt mir bescheid.
Mit freundlichen Grüßen!