Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Implement missing survival tooltip script #1679

Merged
merged 4 commits into from
Dec 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion dGame/dGameMessages/GameMessages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6338,6 +6338,40 @@ void GameMessages::SendUpdateInventoryUi(LWOOBJID objectId, const SystemAddress&

bitStream.Write(objectId);
bitStream.Write(MessageType::Game::UPDATE_INVENTORY_UI);


SEND_PACKET;
}

void GameMessages::DisplayTooltip::Send() const {
CBITSTREAM;
CMSGHEADER;

bitStream.Write(target);
bitStream.Write(msgId);

bitStream.Write(doOrDie);
bitStream.Write(noRepeat);
bitStream.Write(noRevive);
bitStream.Write(isPropertyTooltip);
bitStream.Write(show);
bitStream.Write(translate);
bitStream.Write(time);
bitStream.Write<int32_t>(id.size());
bitStream.Write(id);

std::string toWrite;
for (const auto* item : localizeParams) {
toWrite += item->GetString() + "\n";
}
if (!toWrite.empty()) toWrite.pop_back();
bitStream.Write<int32_t>(toWrite.size());
bitStream.Write(GeneralUtils::ASCIIToUTF16(toWrite));
if (!toWrite.empty()) bitStream.Write<uint16_t>(0x00); // Null Terminator

bitStream.Write<int32_t>(imageName.size());
bitStream.Write(imageName);
bitStream.Write<int32_t>(text.size());
bitStream.Write(text);

SEND_PACKET;
}
27 changes: 27 additions & 0 deletions dGame/dGameMessages/GameMessages.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "eCyclingMode.h"
#include "eLootSourceType.h"
#include "Brick.h"
#include "MessageType/Game.h"

class AMFBaseValue;
class Entity;
Expand All @@ -20,6 +21,7 @@ class User;
class Leaderboard;
class PropertySelectQueryProperty;
class TradeItem;
class LDFBaseData;

enum class eAnimationFlags : uint32_t;

Expand Down Expand Up @@ -47,6 +49,15 @@ enum class eCameraTargetCyclingMode : int32_t {
};

namespace GameMessages {
struct GameMsg {
GameMsg(MessageType::Game gmId) : msgId{ gmId } {}
virtual ~GameMsg() = default;
virtual void Send() const {}
MessageType::Game msgId;
LWOOBJID target{ LWOOBJID_EMPTY };
SystemAddress sysAddr{ UNASSIGNED_SYSTEM_ADDRESS };
};

class PropertyDataMessage;
void SendFireEventClientSide(const LWOOBJID& objectID, const SystemAddress& sysAddr, std::u16string args, const LWOOBJID& object, int64_t param1, int param2, const LWOOBJID& sender);
void SendTeleport(const LWOOBJID& objectID, const NiPoint3& pos, const NiQuaternion& rot, const SystemAddress& sysAddr, bool bSetRotation = false);
Expand Down Expand Up @@ -680,6 +691,22 @@ namespace GameMessages {

// This is a client gm however its default values are exactly what we need to get around the invisible inventory item issues.
void SendUpdateInventoryUi(LWOOBJID objectId, const SystemAddress& sysAddr);

struct DisplayTooltip : public GameMsg {
DisplayTooltip() : GameMsg(MessageType::Game::DISPLAY_TOOLTIP) {}
bool doOrDie{};
bool noRepeat{};
bool noRevive{};
bool isPropertyTooltip{};
bool show{};
bool translate{};
int32_t time{};
std::u16string id{};
std::vector<LDFBaseData*> localizeParams{};
std::u16string imageName{};
std::u16string text{};
void Send() const override;
};
};

#endif // GAMEMESSAGES_H
2 changes: 2 additions & 0 deletions dScripts/CppScripts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,7 @@
#include "LupGenericInteract.h"
#include "WblRobotCitizen.h"
#include "EnemyClearThreat.h"
#include "AgSpiderBossMessage.h"

#include <map>
#include <string>
Expand Down Expand Up @@ -688,6 +689,7 @@ namespace {
{"scripts\\zone\\LUPs\\RobotCity Intro\\WBL_RCIntro_RobotCitizenRed.lua", []() {return new WblRobotCitizen();}},
{"scripts\\zone\\LUPs\\RobotCity Intro\\WBL_RCIntro_RobotCitizenYellow.lua", []() {return new WblRobotCitizen();}},
{"scripts\\02_server\\Map\\General\\L_ENEMY_CLEAR_THREAT.lua", []() {return new EnemyClearThreat();}},
{"scripts\\ai\\AG\\L_AG_SPIDER_BOSS_MESSAGE.lua", []() {return new AgSpiderBossMessage();}},

};

Expand Down
81 changes: 81 additions & 0 deletions dScripts/ai/AG/AgSpiderBossMessage.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#include "AgSpiderBossMessage.h"

#include "Entity.h"
#include "GameMessages.h"

#include "RenderComponent.h"

Box AgSpiderBossMessage::GetBox(Entity* self) const {
return self->GetVar<Box>(u"box");
}

void AgSpiderBossMessage::SetBox(Entity* self, const Box& box) const {
self->SetVar(u"box", box);
}

void AgSpiderBossMessage::MakeBox(Entity* self) const {
auto box = GetBox(self);
if (box.boxTarget == LWOOBJID_EMPTY || box.isDisplayed || box.boxSelf == LWOOBJID_EMPTY) return;

box.isDisplayed = true;
SetBox(self, box);
self->AddTimer("BoxTimer", box.boxTime);

const auto* const tgt = Game::entityManager->GetEntity(box.boxTarget);
if (!tgt) return;
GameMessages::DisplayTooltip tooltip;
tooltip.target = tgt->GetObjectID();
tooltip.sysAddr = tgt->GetSystemAddress();
tooltip.show = true;
tooltip.text = box.boxText;
tooltip.time = box.boxTime * 1000; // to ms
tooltip.Send();
}

void AgSpiderBossMessage::OnCollisionPhantom(Entity* self, Entity* target) {
if (!target || !target->IsPlayer()) return;

auto box = GetBox(self);
// knockback the target
auto forward = target->GetRotation().GetForwardVector();
box.boxTarget = target->GetObjectID();
GameMessages::SendPlayFXEffect(target->GetObjectID(), 1378, u"create", "pushBack");
RenderComponent::PlayAnimation(target, "knockback-recovery");
forward.y += 15;
forward.x *= 100;
forward.z *= 100;
GameMessages::SendKnockback(target->GetObjectID(), self->GetObjectID(), self->GetObjectID(), 0, forward);

if (box.isTouch || box.isDisplayed) return;
box.boxSelf = self->GetObjectID();
box.isTouch = true;
box.boxText = u"%[SPIDER_CAVE_MESSAGE]";
SetBox(self, box);
self->AddTimer("EventTimer", 0.1f);
}

void AgSpiderBossMessage::OnOffCollisionPhantom(Entity* self, Entity* target) {
if (!target) return;
auto box = GetBox(self);
box.isTouch = false;
box.Reset();
SetBox(self, box);
}

void AgSpiderBossMessage::OnTimerDone(Entity* self, std::string timerName) {
if (timerName == "BoxTimer") {
auto box = GetBox(self);
box.isDisplayed = false;
SetBox(self, box);
ResetBox(self);
} else if (timerName == "EventTimer") {
auto box = GetBox(self);
MakeBox(self);
}
}

void AgSpiderBossMessage::ResetBox(Entity* self) const {
auto box = GetBox(self);
box.Reset();
SetBox(self, box);
}
37 changes: 37 additions & 0 deletions dScripts/ai/AG/AgSpiderBossMessage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#ifndef AGSPIDERBOSSMESSAGE_H
#define AGSPIDERBOSSMESSAGE_H

#include "CppScripts.h"

struct Box {
LWOOBJID boxTarget{};
bool isDisplayed{};
bool isTouch{};
bool isFirst{};
LWOOBJID boxSelf{};
std::u16string boxText{};
int32_t boxTime{ 1 };

void Reset() {
boxTarget = LWOOBJID_EMPTY;
isDisplayed = false;
isTouch = false;
isFirst = false;
boxSelf = LWOOBJID_EMPTY;
boxText.clear();
boxTime = 1;
}
};

class AgSpiderBossMessage : public CppScripts::Script {
public:
Box GetBox(Entity* self) const;
void SetBox(Entity* self, const Box& box) const;
void MakeBox(Entity* self) const;
void OnCollisionPhantom(Entity* self, Entity* target) override;
void OnOffCollisionPhantom(Entity* self, Entity* target) override;
void OnTimerDone(Entity* self, std::string timerName) override;
void ResetBox(Entity* self) const;
};

#endif //!AGSPIDERBOSSMESSAGE_H
1 change: 1 addition & 0 deletions dScripts/ai/AG/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
set(DSCRIPTS_SOURCES_AI_AG
"AgShipPlayerDeathTrigger.cpp"
"AgSpaceStuff.cpp"
"AgSpiderBossMessage.cpp"
"AgShipShake.cpp"
"AgShipPlayerShockServer.cpp"
"AgImagSmashable.cpp"
Expand Down
Loading