void ROOM_SPACE::DeleteOwner(People& p) { ePipeline& OwnerInfo = GetOwnerInfo(); ePipeline& OwnerList = *(ePipeline*)OwnerInfo.GetData(REG_OWNER_LIST); for (int i=0; i<OwnerInfo.Size();i++) { ePipeline* Owner = (ePipeline*)OwnerList.GetData(i); tstring& Cryptograph = *(tstring*)Owner->GetData(2); if (Cryptograph == p.m_Cryptograhp) { OwnerList.EraseEnergy(i,1); return ; } } if(p.GetParentID() == GetSpaceID()){ p.GoOut(); //这里应该有更多处理,p被赶出此空间,那么应该退回到上一个空间 assert(0); return; } }
bool ROOM_SPACE::AddOwner(const TCHAR* Name,tstring& Cryptograph,SPACE_RIGHT r) { assert(IsValid()); if (!IsValid()) { return false; } ePipeline& OwnerInfo = GetOwnerInfo(); ePipeline& OwnerList = *(ePipeline*)OwnerInfo.GetData(REG_OWNER_LIST); ePipeline Owner; CreateDefaultOwner(Owner); *(tstring*)Owner.GetData(0) = Name; *(int64*)Owner.GetData(1) = (int64)r; *(tstring*)Owner.GetData(2) = Cryptograph; OwnerList.PushPipe(Owner); UpdateOwnerInfo(); return true; }
ROOM_SPACE::ROOM_SPACE(int64 ParentID,int64 ID,tstring Name, int64 Size,SPACETYPE Type,SPACE_RIGHT r,tstring Fingerprint) { assert(ParentID); assert(ID); m_ID = ParentID; int64& ChilID = *(int64*)GetData(0); ChilID = ID; SetName(Name); SetSpaceType(Type); SetFingerprint(Fingerprint); *(int64*)GetProperty().GetData(PROPERTY_SIZE) = Size; *(SPACE_RIGHT*)GetOwnerInfo().GetData(REG_RIGHT) = r; UpdateAll(TRUE); }
People::People(int64 ParentID,int64 ID,tstring Name,tstring& Cryptograph,SPACETYPE Type,SPACE_RIGHT r,tstring Fingerprint) { assert(ParentID); assert(ID); m_AutoLeave = true; m_ID = ParentID; int64& ChilID = *(int64*)GetData(0); ChilID = ID; SetName(Name); SetSpaceType(Type); SetFingerprint(Fingerprint); *(SPACE_RIGHT*)GetOwnerInfo().GetData(REG_RIGHT) = r; UpdateAll(TRUE); }
void CSpace::UpdateOwnerInfo(){ if(!IsValid())return; AnsiString OwnerInfo; GetOwnerInfo().ToString(OwnerInfo); int64 ParentID = GetParentID(); int64 ChildID = GetSpaceID(); CppSQLite3Buffer SQL; char ParentName[30], ChildName[30]; int64toa(ParentID,ParentName); int64toa(ChildID,ChildName); SQL.format("update \"%s\" set %s=\"%s\" where %s = \"%s\" ;", ParentName, ITEM_OWNER, OwnerInfo.c_str(), ITEM_ID, ChildName ); GetWorldDB().execDML(SQL); };
void QuestObjectiveCriteriaMgr::CompletedObjective(QuestObjective const* questObjective, Player* referencePlayer) { // disable for gamemasters with GM-mode enabled if (_owner->IsGameMaster()) return; if (HasCompletedObjective(questObjective)) return; referencePlayer->KillCreditCriteriaTreeObjective(*questObjective); TC_LOG_INFO("criteria.quest", "QuestObjectiveCriteriaMgr::CompletedObjective(%u). %s", questObjective->ID, GetOwnerInfo().c_str()); _completedObjectives.insert(questObjective->ID); }
void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievement, Player* referencePlayer) { // disable for gamemasters with GM-mode enabled if (_owner->IsGameMaster()) return; if ((achievement->Faction == ACHIEVEMENT_FACTION_HORDE && referencePlayer->GetTeam() != HORDE) || (achievement->Faction == ACHIEVEMENT_FACTION_ALLIANCE && referencePlayer->GetTeam() != ALLIANCE)) return; if (achievement->Flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID)) return; if (achievement->Flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS) if (Guild* guild = referencePlayer->GetGuild()) guild->AddGuildNews(GUILD_NEWS_PLAYER_ACHIEVEMENT, referencePlayer->GetGUID(), achievement->Flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID); if (!_owner->GetSession()->PlayerLoading()) SendAchievementEarned(achievement); TC_LOG_INFO("criteria.achievement", "PlayerAchievementMgr::CompletedAchievement(%u). %s", achievement->ID, GetOwnerInfo().c_str()); CompletedAchievementData& ca = _completedAchievements[achievement->ID]; ca.Date = time(NULL); ca.Changed = true; if (achievement->Flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) sAchievementMgr->SetRealmCompleted(achievement); if (!(achievement->Flags & ACHIEVEMENT_FLAG_TRACKING_FLAG)) _achievementPoints += achievement->Points; UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, 0, 0, 0, NULL, referencePlayer); UpdateCriteria(CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->Points, 0, 0, NULL, referencePlayer); // reward items and titles if any AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement); // no rewards if (!reward) return; // titles //! Currently there's only one achievement that deals with gender-specific titles. //! Since no common attributes were found, (not even in titleRewardFlags field) //! we explicitly check by ID. Maybe in the future we could move the achievement_reward //! condition fields to the condition system. if (uint32 titleId = reward->TitleId[achievement->ID == 1793 ? _owner->GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_GENDER) : (_owner->GetTeam() == ALLIANCE ? 0 : 1)]) if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) _owner->SetTitle(titleEntry); // mail if (reward->SenderCreatureId) { MailDraft draft(uint16(reward->MailTemplateId)); if (!reward->MailTemplateId) { // subject and text std::string subject = reward->Subject; std::string text = reward->Body; LocaleConstant localeConstant = _owner->GetSession()->GetSessionDbLocaleIndex(); if (localeConstant != LOCALE_enUS) { if (AchievementRewardLocale const* loc = sAchievementMgr->GetAchievementRewardLocale(achievement)) { ObjectMgr::GetLocaleString(loc->Subject, localeConstant, subject); ObjectMgr::GetLocaleString(loc->Body, localeConstant, text); } } draft = MailDraft(subject, text); } SQLTransaction trans = CharacterDatabase.BeginTransaction(); Item* item = reward->ItemId ? Item::CreateItem(reward->ItemId, 1, _owner) : NULL; if (item) { // save new item before send item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted // item draft.AddItem(item); } draft.SendMailTo(trans, _owner, MailSender(MAIL_CREATURE, uint64(reward->SenderCreatureId))); CharacterDatabase.CommitTransaction(trans); } }
bool ROOM_SPACE::AllowInto(People& p){ if (!IsValid()) { return false; } //如果已经在此空间则直接返回 if(p.GetParentID() == m_ID)return true; int64 ChildID = 0; ePipeline& OwnerInfo = GetOwnerInfo(); SPACE_RIGHT RoomRight = *(SPACE_RIGHT*)OwnerInfo.GetData(REG_RIGHT); ePipeline& OwnerList = *(ePipeline*)OwnerInfo.GetData(REG_OWNER_LIST); for (int i=0; i<OwnerList.Size();i++) { ePipeline* Owner = (ePipeline*)OwnerList.GetData(i); tstring& Cryptograph = *(tstring*)Owner->GetData(2); if (Cryptograph == p.m_Cryptograhp) { SPACE_RIGHT Right = *(SPACE_RIGHT*)Owner->GetData(1); if(Right >= RoomRight){ return true; } break; } } //访问者不是固定注册的拥有者,但只要当前空间不禁止参观也可以进入 bool Allow = false; switch(RoomRight) { case NO_RIGHT: { //能够访问,robot的访问权限保持不变 Allow = true; } break; case VISIT_ONLY: { Allow = true; } break; case VISIT_NOTIFY: { //通知其它人,暂时没有实现 assert(0); } break; case VISIT_APPLY: { //提出申请,暂时没有实现 assert(0); } case USABLE: { Allow = true; } break; case USABLE_NOTIFY: { //通知其它人,暂时没有实现 assert(0); } break; case USABLE_APPLY: { //提出申请,暂时没有实现 assert(0); } break; case HOLD_NOTIFY: { //通知其它人,暂时没有实现 assert(0); } break; case HOLD_APPLY: { //提出申请,暂时没有实现 assert(0); } break; case RIGHT_HOLD: { //显然不允许 } break; } return Allow; }
void CSpace::UpdateAll(BOOL bInsertNew){ if(!IsValid())return ; int64 ParentID = m_ID; AnsiString Name; Name = WStoUTF8(GetName()); int64 ChildID = GetSpaceID(); if (bInsertNew) { if(ChildID== -1){ ChildID = AbstractSpace::CreateTimeStamp(); } } SPACETYPE Type = GetSpaceType(); AnsiString Fingerprint = WStoUTF8(GetFingerprint()); AnsiString Property; GetProperty().ToString(Property); AnsiString OwnerInfo; GetOwnerInfo().ToString(OwnerInfo); CppSQLite3Buffer SQL; char ParentName[30], ChildName[30]; int64toa(ParentID,ParentName); int64toa(ChildID,ChildName); if (bInsertNew) { if (!HasTable(ParentID)) { CreateTable(ParentID); } SQL.format(" insert into \"%s\" values(\"%s\",\"%s\",%d,\"%s\",\"%s\" ,\"%s\");", ParentName, ChildName, Name.c_str(), Type, Fingerprint.c_str(), Property.c_str(), OwnerInfo.c_str() ); }else{ SQL.format("update \"%s\" set %s=\"%s\" %s=%d %s=\"%s\" %s=\"%s\" %s=\"%s\" where %s = \"%s\" ;", ParentName, ITEM_NAME, Name.c_str(), ITEM_TYPE, Type, ITEM_FINGERPRINT, Fingerprint.c_str(), ITEM_PROPERTY, Property.c_str(), ITEM_OWNER, OwnerInfo.c_str(), ITEM_ID, ChildName ); } GetWorldDB().execDML(SQL); };