Beispiel #1
0
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;
	}

}
Beispiel #2
0
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;
}
Beispiel #3
0
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);
}
Beispiel #4
0
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);
}
Beispiel #5
0
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);
}
Beispiel #7
0
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);
    }
}
Beispiel #8
0
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;
}
Beispiel #9
0
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);
};