// 파티 단위로 버프 주는 함수. // 같은 맵에 있는 파티원만 영향을 받는다. int party_give_buff (lua_State* L) { CQuestManager & q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3) || !lua_isnumber(L, 4) || !lua_isnumber(L, 5) || !lua_isnumber(L, 6) || !lua_isboolean(L, 7) || !lua_isboolean(L, 8)) { lua_pushboolean (L, false); return 1; } DWORD dwType = lua_tonumber(L, 1); BYTE bApplyOn = lua_tonumber(L, 2); long lApplyValue = lua_tonumber(L, 3); DWORD dwFlag = lua_tonumber(L, 4); long lDuration = lua_tonumber(L, 5); long lSPCost = lua_tonumber(L, 6); bool bOverride = lua_toboolean(L, 7); bool IsCube = lua_toboolean(L, 8); FGiveBuff f (dwType, bApplyOn, lApplyValue, dwFlag, lDuration, lSPCost, bOverride, IsCube); if (ch->GetParty()) ch->GetParty()->ForEachOnMapMember(f, ch->GetMapIndex()); else f(ch); lua_pushboolean (L, true); return 1; }
LPPARTY CPartyManager::CreateParty(LPCHARACTER pLeader) { if (pLeader->GetParty()) return pLeader->GetParty(); LPPARTY pParty = M2_NEW CParty; if (pLeader->IsPC()) { //TPacketGGParty p; //p.header = HEADER_GG_PARTY; //p.subheader = PARTY_SUBHEADER_GG_CREATE; //p.pid = pLeader->GetPlayerID(); //P2P_MANAGER::instance().Send(&p, sizeof(p)); TPacketPartyCreate p; p.dwLeaderPID = pLeader->GetPlayerID(); db_clientdesc->DBPacket(HEADER_GD_PARTY_CREATE, 0, &p, sizeof(TPacketPartyCreate)); sys_log(0, "PARTY: Create %s pid %u", pLeader->GetName(), pLeader->GetPlayerID()); pParty->SetPCParty(true); pParty->Join(pLeader->GetPlayerID()); m_set_pkPCParty.insert(pParty); } else { pParty->SetPCParty(false); pParty->Join(pLeader->GetVID()); } pParty->Link(pLeader); return (pParty); }
int party_set_flag(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty() && lua_isstring(L, 1) && lua_isnumber(L, 2)) ch->GetParty()->SetFlag(lua_tostring(L, 1), (int)lua_tonumber(L, 2)); return 0; }
int party_get_max_level(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty()) lua_pushnumber(L,ch->GetParty()->GetMemberMaxLevel()); else lua_pushnumber(L, 1); return 1; }
int party_get_flag(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch->GetParty() || !lua_isstring(L, 1)) lua_pushnumber(L, 0); else lua_pushnumber(L, ch->GetParty()->GetFlag(lua_tostring(L, 1))); return 1; }
int party_is_leader(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty() && ch->GetParty()->GetLeaderPID() == ch->GetPlayerID()) lua_pushboolean(L, 1); else lua_pushboolean(L, 0); return 1; }
// // "party" Lua functions // int party_clear_ready(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty()) { FPartyClearReady f; ch->GetParty()->ForEachNearMember(f); } return 0; }
int party_get_near_count(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty()) lua_pushnumber(L, ch->GetParty()->GetNearMemberCount()); else lua_pushnumber(L, 0); return 1; }
int party_get_leader_pid(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty()) { lua_pushnumber(L, ch->GetParty()->GetLeaderPID()); } else { lua_pushnumber(L, -1); } return 1; }
int party_show_cinematic(lua_State* L) { if (!lua_isstring(L, 1)) return 0; sys_log(0, "CINEMA %s", lua_tostring(L, 1)); LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty()) { FCinematicSender f(lua_tostring(L, 1)); ch->GetParty()->Update(); ch->GetParty()->ForEachNearMember(f); } return 0; }
int party_set_quest_flag(lua_State* L) { CQuestManager & q = CQuestManager::instance(); FSetQuestFlag f; f.flagname = q.GetCurrentPC()->GetCurrentQuestName() + "." + lua_tostring(L, 1); f.value = (int) rint(lua_tonumber(L, 2)); LPCHARACTER ch = q.GetCurrentCharacterPtr(); if (ch->GetParty()) ch->GetParty()->ForEachOnlineMember(f); else f(ch); return 0; }
int party_is_in_dungeon (lua_State* L) { CQuestManager & q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); LPPARTY pParty = ch->GetParty(); if (pParty != NULL){ lua_pushboolean (L, pParty->GetDungeon() ? true : false); return 1; } lua_pushboolean (L, false); return 1; }
int party_get_member_pids(lua_State *L) { CQuestManager & q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); LPPARTY pParty = ch->GetParty(); if (NULL == pParty) { return 0; } FPartyPIDCollector f; pParty->ForEachOnMapMember(f, ch->GetMapIndex()); for (std::vector <DWORD>::iterator it = f.vecPIDs.begin(); it != f.vecPIDs.end(); it++) { lua_pushnumber(L, *it); } return f.vecPIDs.size(); }
void CParty::SendMessage(LPCHARACTER ch, BYTE bMsg, DWORD dwArg1, DWORD dwArg2) { if (ch->GetParty() != this) { sys_err("%s is not member of this party %p", ch->GetName(), this); return; } switch (bMsg) { case PM_ATTACK: break; case PM_RETURN: { TMemberMap::iterator it = m_memberMap.begin(); while (it != m_memberMap.end()) { TMember & rMember = it->second; ++it; LPCHARACTER pkChr; if ((pkChr = rMember.pCharacter) && ch != pkChr) { DWORD x = dwArg1 + number(-500, 500); DWORD y = dwArg2 + number(-500, 500); pkChr->SetVictim(NULL); pkChr->SetRotationToXY(x, y); if (pkChr->Goto(x, y)) { LPCHARACTER victim = pkChr->GetVictim(); sys_log(0, "%s %p RETURN victim %p", pkChr->GetName(), get_pointer(pkChr), get_pointer(victim)); pkChr->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0); } } } } break; case PM_ATTACKED_BY: // 공격 받았음, 리더에게 도움을 요청 { // 리더가 없을 때 LPCHARACTER pkChrVictim = ch->GetVictim(); if (!pkChrVictim) return; TMemberMap::iterator it = m_memberMap.begin(); while (it != m_memberMap.end()) { TMember & rMember = it->second; ++it; LPCHARACTER pkChr; if ((pkChr = rMember.pCharacter) && ch != pkChr) { if (pkChr->CanBeginFight()) pkChr->BeginFight(pkChrVictim); } } } break; case PM_AGGRO_INCREASE: { LPCHARACTER victim = CHARACTER_MANAGER::instance().Find(dwArg2); if (!victim) return; TMemberMap::iterator it = m_memberMap.begin(); while (it != m_memberMap.end()) { TMember & rMember = it->second; ++it; LPCHARACTER pkChr; if ((pkChr = rMember.pCharacter) && ch != pkChr) { pkChr->UpdateAggrPoint(victim, DAMAGE_TYPE_SPECIAL, dwArg1); } } } break; } }
int party_is_party(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); lua_pushboolean(L, ch->GetParty() ? 1 : 0); return 1; }
bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim) { switch (pkVictim->GetCharType()) { case CHAR_TYPE_NPC: case CHAR_TYPE_WARP: case CHAR_TYPE_GOTO: return false; } if (pkChr == pkVictim) // 내가 날 칠라고 하네 -_- return false; if (pkVictim->IsNPC() && pkChr->IsNPC() && !pkChr->IsGuardNPC()) return false; if( true == pkChr->IsHorseRiding() ) { if( pkChr->GetHorseLevel() > 0 && 1 == pkChr->GetHorseGrade() ) return false; } else { switch( pkChr->GetMountVnum() ) { case 0: case 20030: case 20110: case 20111: case 20112: case 20113: case 20114: case 20115: case 20116: case 20117: case 20118: //신규 탈것 고급 case 20205: case 20206: case 20207: case 20208: case 20209: case 20210: case 20211: case 20212: case 20119: // 라마단 흑마 case 20219: // 라마단 흑마 클론 (할로윈용) case 20220: // 크리스마스 탈것 case 20221: // 전갑 백웅 case 20222: // 전갑 팬더 case 20120: case 20121: case 20122: case 20123: case 20124: case 20125: case 20214: // 난폭한 전갑순순록 case 20215: // 용맹한 전갑순순록 case 20217: // 난폭한 전갑암순록 case 20218: // 용맹한 전갑암순록 case 20224: // 난폭한 전갑석룡자 case 20225: // 용맹한 전갑석룡자 case 20226: // 유니콘 case 20227: break; default: return false; } } if (pkVictim->IsNPC() || pkChr->IsNPC()) { return true; } if (pkVictim->IsObserverMode() || pkChr->IsObserverMode()) return false; { BYTE bMapEmpire = SECTREE_MANAGER::instance().GetEmpireFromMapIndex(pkChr->GetMapIndex()); if ( pkChr->GetPKMode() == PK_MODE_PROTECT && pkChr->GetEmpire() == bMapEmpire || pkVictim->GetPKMode() == PK_MODE_PROTECT && pkVictim->GetEmpire() == bMapEmpire ) { return false; } } if (pkChr->GetEmpire() != pkVictim->GetEmpire()) { if ( LC_IsYMIR() == true || LC_IsKorea() == true ) { if ( pkChr->GetPKMode() == PK_MODE_PROTECT || pkVictim->GetPKMode() == PK_MODE_PROTECT ) { return false; } } return true; } bool beKillerMode = false; if (pkVictim->GetParty() && pkVictim->GetParty() == pkChr->GetParty()) { return false; // Cannot attack same party on any pvp model } else { if (pkVictim->IsKillerMode()) { return true; } if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() >= 0) { if (g_protectNormalPlayer) { // 범법자는 평화모드인 착한사람을 공격할 수 없다. if (PK_MODE_PEACE == pkVictim->GetPKMode()) return false; } } switch (pkChr->GetPKMode()) { case PK_MODE_PEACE: case PK_MODE_REVENGE: // Cannot attack same guild if (pkVictim->GetGuild() && pkVictim->GetGuild() == pkChr->GetGuild()) break; if (pkChr->GetPKMode() == PK_MODE_REVENGE) { //if (!g_iUseLocale) if (1) { if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() >= 0) { pkChr->SetKillerMode(true); return true; } else if (pkChr->GetAlignment() >= 0 && pkVictim->GetAlignment() < 0) return true; } else { if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0) break; else if (pkChr->GetAlignment() >= 0 && pkVictim->GetAlignment() >= 0) break; beKillerMode = true; } } break; case PK_MODE_GUILD: // Same implementation from PK_MODE_FREE except for attacking same guild if (!pkChr->GetGuild() || (pkVictim->GetGuild() != pkChr->GetGuild())) { if (1) //if (!g_iUseLocale) { if (pkVictim->GetAlignment() >= 0) pkChr->SetKillerMode(true); else if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0) pkChr->SetKillerMode(true); return true; } else beKillerMode = true; } break; case PK_MODE_FREE: //if (!g_iUseLocale) if (1) { if (pkVictim->GetAlignment() >= 0) pkChr->SetKillerMode(true); else if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0) pkChr->SetKillerMode(true); return true; } else beKillerMode = true; break; } } CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID()); CPVP * pkPVP = Find(kPVP.m_dwCRC); if (!pkPVP || !pkPVP->IsFight()) { if (beKillerMode) pkChr->SetKillerMode(true); return (beKillerMode); } pkPVP->SetLastFightTime(); return true; }