bool CPartyDef::GetLootFlag( const CChar *pChar ) { ADDTOCALLSTACK("CPartyDef::GetLootFlag"); ASSERT(pChar); if ( IsInParty(pChar) ) return (pChar->GetKeyNum("PARTY_CANLOOTME") != 0); return false; }
void CPartyDef::SetLootFlag( CChar *pChar, bool fSet ) { ADDTOCALLSTACK("CPartyDef::SetLootFlag"); ASSERT(pChar); if ( IsInParty(pChar) ) { pChar->SetKeyNum("PARTY_CANLOOTME", fSet); pChar->SysMessageDefault(fSet ? DEFMSG_PARTY_LOOT_ALLOW : DEFMSG_PARTY_LOOT_BLOCK); } }
bool CPartyDef::RemoveMember( CGrayUID uidRemove, CGrayUID uidCommand ) { ADDTOCALLSTACK("CPartyDef::RemoveMember"); // ARGS: // uidRemove = Who is being removed. // uidCommand = who removed this person (only the master or self can remove) // // NOTE: remove of the master will cause the party to disband. if ( m_Chars.GetCharCount() <= 0 ) return false; CGrayUID uidMaster = GetMaster(); if ( (uidRemove != uidCommand) && (uidCommand != uidMaster) ) return false; CChar *pCharRemove = uidRemove.CharFind(); if ( !pCharRemove ) return false; if ( !IsInParty(pCharRemove) ) return false; if ( uidRemove == uidMaster ) return Disband(uidMaster); CChar *pSrc = uidCommand.CharFind(); if ( pSrc && IsTrigUsed(TRIGGER_PARTYREMOVE) ) { CScriptTriggerArgs args; if ( pCharRemove->OnTrigger(CTRIG_PartyRemove, pSrc, &args) == TRIGRET_RET_TRUE ) return false; } if ( IsTrigUsed(TRIGGER_PARTYLEAVE) ) { if ( pCharRemove->OnTrigger(CTRIG_PartyLeave, pCharRemove, 0) == TRIGRET_RET_TRUE ) return false; } // Remove it from the party SendRemoveList(pCharRemove, true); DetachChar(pCharRemove); pCharRemove->SysMessageDefault(DEFMSG_PARTY_LEAVE_2); TCHAR *pszMsg = Str_GetTemp(); sprintf(pszMsg, g_Cfg.GetDefaultMsg(DEFMSG_PARTY_LEAVE_1), pCharRemove->GetName()); SysMessageAll(pszMsg); if ( m_Chars.GetCharCount() <= 1 ) { // Disband the party SysMessageAll(g_Cfg.GetDefaultMsg(DEFMSG_PARTY_LEAVE_LAST_PERSON)); return Disband(uidMaster); } return true; }
bool CPartyDef::SetMaster( CChar *pNewMaster ) { if ( !pNewMaster ) return false; else if ( !IsInParty(pNewMaster) || IsPartyMaster(pNewMaster) ) return false; size_t i = m_Chars.InsertChar(pNewMaster, 0); SendAddList(NULL); return (i == 0); }
// --------------------------------------------------------- bool CPartyDef::MessageEvent( CGrayUID uidDst, CGrayUID uidSrc, const NCHAR * pText, int ilenmsg ) { ADDTOCALLSTACK("CPartyDef::MessageEvent"); UNREFERENCED_PARAMETER(ilenmsg); if ( pText == NULL ) return( false ); if ( uidDst && !IsInParty( uidDst.CharFind() ) ) return( false ); CChar * pFrom = uidSrc.CharFind(); CChar * pTo = NULL; if ( uidDst != (DWORD) 0 ) pTo = uidDst.CharFind(); TCHAR * szText = Str_GetTemp(); CvtNUNICODEToSystem( szText, MAX_TALK_BUFFER, pText, MAX_TALK_BUFFER ); if ( ! m_pSpeechFunction.IsEmpty() ) { TRIGRET_TYPE tr = TRIGRET_RET_FALSE; CScriptTriggerArgs Args; Args.m_iN1 = uidSrc; Args.m_iN2 = uidDst; Args.m_s1 = szText; Args.m_s1_raw = szText; if ( r_Call(m_pSpeechFunction, &g_Serv, &Args, NULL, &tr) ) { if ( tr == TRIGRET_RET_TRUE ) return( false ); } } if ( g_Log.IsLoggedMask( LOGM_PLAYER_SPEAK )) g_Log.Event( LOGM_PLAYER_SPEAK, "%lx:'%s' Says '%s' in party to '%s'\n", pFrom->GetClient()->GetSocketID(), pFrom->GetName(), szText, pTo ? pTo->GetName() : "all" ); sprintf(szText, g_Cfg.GetDefaultMsg( DEFMSG_PARTY_MSG ), pText); PacketPartyChat cmd(pFrom, pText); if ( pTo != NULL ) SendMemberMsg(pTo, &cmd); else SendAll(&cmd); return( true ); }
bool CPartyDef::r_Verb( CScript &s, CTextConsole *pSrc ) { ADDTOCALLSTACK("CPartyDef::r_Verb"); EXC_TRY("Verb"); ASSERT(pSrc); LPCTSTR pszKey = s.GetKey(); CScriptObj *pRef; if ( r_GetRef(pszKey, pRef) ) { if ( pszKey[0] ) { if ( !pRef ) return true; CScript script(pszKey, s.GetArgStr()); return pRef->r_Verb(script, pSrc); } } int iIndex = FindTableSorted(pszKey, sm_szVerbKeys, COUNTOF(sm_szVerbKeys) - 1); switch ( iIndex ) { case PDV_ADDMEMBER: case PDV_ADDMEMBERFORCED: { bool bForced = (iIndex == PDV_ADDMEMBERFORCED); CGrayUID toAdd = static_cast<CGrayUID>(s.GetArgVal()); CChar *pCharAdd = toAdd.CharFind(); CChar *pCharMaster = GetMaster().CharFind(); if ( !pCharAdd || IsInParty(pCharAdd) ) return false; if ( pCharMaster && !bForced ) pCharMaster->SetKeyNum("PARTY_LASTINVITE", (long long)toAdd); return CPartyDef::AcceptEvent(pCharAdd, GetMaster(), bForced); } break; case PDV_CLEARTAGS: { LPCTSTR pszArg = s.GetArgStr(); SKIP_SEPARATORS(pszArg); m_TagDefs.ClearKeys(pszArg); } break; case PDV_CREATE: return true; case PDV_DISBAND: return Disband(GetMaster()); case PDV_MESSAGE: break; case PDV_REMOVEMEMBER: { CGrayUID toRemove; LPCTSTR pszArg = s.GetArgStr(); if ( *pszArg == '@' ) { pszArg++; size_t nMember = Exp_GetVal(pszArg); if ( !m_Chars.IsValidIndex(nMember) ) return false; toRemove = m_Chars.GetChar(nMember); } else toRemove = static_cast<CGrayUID>(s.GetArgVal()); if ( toRemove ) return RemoveMember(toRemove, GetMaster()); return false; } break; case PDV_SETMASTER: { CGrayUID newMaster; LPCTSTR pszArg = s.GetArgStr(); if ( *pszArg == '@' ) { pszArg++; size_t nMember = Exp_GetVal(pszArg); if ( nMember == 0 || !m_Chars.IsValidIndex(nMember) ) return false; newMaster = m_Chars.GetChar(nMember); } else newMaster = static_cast<CGrayUID>(s.GetArgVal()); if ( newMaster ) return SetMaster(newMaster.CharFind()); return false; } break; case PDV_SYSMESSAGE: { CGrayUID toSysmessage; LPCTSTR pszArg = s.GetArgStr(); TCHAR *pUid = Str_GetTemp(); size_t x = 0; if ( *pszArg == '@' ) { pszArg++; if ( *pszArg != '@' ) { LPCTSTR __pszArg = pszArg; while ( *pszArg != ' ' ) { pszArg++; x++; } strcpylen(pUid, __pszArg, ++x); size_t nMember = Exp_GetVal(pUid); if ( !m_Chars.IsValidIndex(nMember) ) return false; toSysmessage = m_Chars.GetChar(nMember); } } else { LPCTSTR __pszArg = pszArg; while ( *pszArg != ' ' ) { pszArg++; x++; } strcpylen(pUid, __pszArg, ++x); toSysmessage = static_cast<CGrayUID>(Exp_GetVal(pUid)); } SKIP_SEPARATORS(pszArg); if ( toSysmessage ) { CChar *pSend = toSysmessage.CharFind(); pSend->SysMessage(pszArg); } else SysMessageAll(pszArg); } break; case PDV_TAGLIST: m_TagDefs.DumpKeys(pSrc, "TAG."); break; default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPTSRC; EXC_DEBUG_END; return false; }