Core/GameObjects: Implemented AllowMultiInteract for GAMEOBJECT_TYPE_GOOBER
Port From (https://github.com/TrinityCore/TrinityCore/commit/f52f2cc67ad91fa9017f6739e0efdf9677c5d629)
This commit is contained in:
@@ -957,6 +957,14 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DespawnForPlayer(Player seer, TimeSpan respawnTime)
|
||||||
|
{
|
||||||
|
PerPlayerState perPlayerState = GetOrCreatePerPlayerStates()[seer.GetGUID()];
|
||||||
|
perPlayerState.ValidUntil = GameTime.GetSystemTime() + respawnTime;
|
||||||
|
perPlayerState.Despawned = true;
|
||||||
|
seer.UpdateVisibilityOf(this);
|
||||||
|
}
|
||||||
|
|
||||||
public void Delete()
|
public void Delete()
|
||||||
{
|
{
|
||||||
SetLootState(LootState.NotReady);
|
SetLootState(LootState.NotReady);
|
||||||
@@ -1891,11 +1899,10 @@ namespace Game.Entities
|
|||||||
case GameObjectTypes.Goober: //10
|
case GameObjectTypes.Goober: //10
|
||||||
{
|
{
|
||||||
GameObjectTemplate info = GetGoInfo();
|
GameObjectTemplate info = GetGoInfo();
|
||||||
|
Player player = user.ToPlayer();
|
||||||
|
|
||||||
if (user.IsTypeId(TypeId.Player))
|
if (player != null)
|
||||||
{
|
{
|
||||||
Player player = user.ToPlayer();
|
|
||||||
|
|
||||||
if (info.Goober.pageID != 0) // show page...
|
if (info.Goober.pageID != 0) // show page...
|
||||||
{
|
{
|
||||||
PageTextPkt data = new();
|
PageTextPkt data = new();
|
||||||
@@ -1941,16 +1948,26 @@ namespace Game.Entities
|
|||||||
if (trapEntry != 0)
|
if (trapEntry != 0)
|
||||||
TriggeringLinkedGameObject(trapEntry, user);
|
TriggeringLinkedGameObject(trapEntry, user);
|
||||||
|
|
||||||
SetFlag(GameObjectFlags.InUse);
|
if (info.Goober.AllowMultiInteract != 0 && player != null)
|
||||||
SetLootState(LootState.Activated, user);
|
{
|
||||||
|
if (info.IsDespawnAtAction())
|
||||||
// this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389)
|
DespawnForPlayer(player, TimeSpan.FromSeconds(m_respawnDelayTime));
|
||||||
if (info.Goober.customAnim != 0)
|
else
|
||||||
SendCustomAnim(GetGoAnimProgress());
|
SetGoStateFor(GameObjectState.Active, player);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
SetGoState(GameObjectState.Active);
|
{
|
||||||
|
SetFlag(GameObjectFlags.InUse);
|
||||||
|
SetLootState(LootState.Activated, user);
|
||||||
|
|
||||||
m_cooldownTime = GameTime.GetGameTimeMS() + info.GetAutoCloseTime();
|
// this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389)
|
||||||
|
if (info.Goober.customAnim != 0)
|
||||||
|
SendCustomAnim(GetGoAnimProgress());
|
||||||
|
else
|
||||||
|
SetGoState(GameObjectState.Active);
|
||||||
|
|
||||||
|
m_cooldownTime = GameTime.GetGameTimeMS() + info.GetAutoCloseTime();
|
||||||
|
}
|
||||||
|
|
||||||
// cast this spell later if provided
|
// cast this spell later if provided
|
||||||
spellId = info.Goober.spell;
|
spellId = info.Goober.spell;
|
||||||
@@ -2906,14 +2923,10 @@ namespace Game.Entities
|
|||||||
GameObjectTemplate goInfo = GetGoInfo();
|
GameObjectTemplate goInfo = GetGoInfo();
|
||||||
if (goInfo.Chest.consumable == 0 && goInfo.Chest.chestPersonalLoot != 0)
|
if (goInfo.Chest.consumable == 0 && goInfo.Chest.chestPersonalLoot != 0)
|
||||||
{
|
{
|
||||||
PerPlayerState perPlayerState = GetOrCreatePerPlayerStates()[looter.GetGUID()];
|
DespawnForPlayer(looter, goInfo.Chest.chestRestockTime != 0
|
||||||
perPlayerState.ValidUntil = GameTime.GetSystemTime() + (goInfo.Chest.chestRestockTime != 0
|
|
||||||
? TimeSpan.FromSeconds(goInfo.Chest.chestRestockTime)
|
? TimeSpan.FromSeconds(goInfo.Chest.chestRestockTime)
|
||||||
: TimeSpan.FromSeconds(m_respawnDelayTime)); // not hiding this object permanently to prevent infinite growth of m_perPlayerState
|
: TimeSpan.FromSeconds(m_respawnDelayTime)); // not hiding this object permanently to prevent infinite growth of m_perPlayerState
|
||||||
// while also maintaining some sort of cheater protection (not getting rid of entries on logout)
|
// while also maintaining some sort of cheater protection (not getting rid of entries on logout)
|
||||||
perPlayerState.Despawned = true;
|
|
||||||
|
|
||||||
looter.UpdateVisibilityOf(this);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,12 +131,21 @@ namespace Game.Entities
|
|||||||
dynFlags |= GameObjectDynamicLowFlags.Activate;
|
dynFlags |= GameObjectDynamicLowFlags.Activate;
|
||||||
break;
|
break;
|
||||||
case GameObjectTypes.Chest:
|
case GameObjectTypes.Chest:
|
||||||
case GameObjectTypes.Goober:
|
|
||||||
if (gameObject.ActivateToQuest(receiver))
|
if (gameObject.ActivateToQuest(receiver))
|
||||||
dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight;
|
dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight;
|
||||||
else if (receiver.IsGameMaster())
|
else if (receiver.IsGameMaster())
|
||||||
dynFlags |= GameObjectDynamicLowFlags.Activate;
|
dynFlags |= GameObjectDynamicLowFlags.Activate;
|
||||||
break;
|
break;
|
||||||
|
case GameObjectTypes.Goober:
|
||||||
|
if (gameObject.ActivateToQuest(receiver))
|
||||||
|
{
|
||||||
|
dynFlags |= GameObjectDynamicLowFlags.Highlight;
|
||||||
|
if (gameObject.GetGoStateFor(receiver.GetGUID()) != GameObjectState.Active)
|
||||||
|
dynFlags |= GameObjectDynamicLowFlags.Activate;
|
||||||
|
}
|
||||||
|
else if (receiver.IsGameMaster())
|
||||||
|
dynFlags |= GameObjectDynamicLowFlags.Activate;
|
||||||
|
break;
|
||||||
case GameObjectTypes.Generic:
|
case GameObjectTypes.Generic:
|
||||||
if (gameObject.ActivateToQuest(receiver))
|
if (gameObject.ActivateToQuest(receiver))
|
||||||
dynFlags |= GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight;
|
dynFlags |= GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight;
|
||||||
|
|||||||
@@ -2978,6 +2978,7 @@ namespace Game.Entities
|
|||||||
case GameObjectTypes.Chest:
|
case GameObjectTypes.Chest:
|
||||||
case GameObjectTypes.Goober:
|
case GameObjectTypes.Goober:
|
||||||
case GameObjectTypes.Generic:
|
case GameObjectTypes.Generic:
|
||||||
|
case GameObjectTypes.GatheringNode:
|
||||||
if (Global.ObjectMgr.IsGameObjectForQuests(obj.GetEntry()))
|
if (Global.ObjectMgr.IsGameObjectForQuests(obj.GetEntry()))
|
||||||
objMask.MarkChanged(obj.m_objectData.DynamicFlags);
|
objMask.MarkChanged(obj.m_objectData.DynamicFlags);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -4709,6 +4709,14 @@ namespace Game
|
|||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
case GameObjectTypes.GatheringNode:
|
||||||
|
{
|
||||||
|
// scan GO chest with loot including quest items
|
||||||
|
// find quest loot for GO
|
||||||
|
if (LootStorage.Gameobject.HaveQuestLootFor(pair.Value.GatheringNode.chestLoot))
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user