mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-11-04 06:32:00 +00:00 
			
		
		
		
	Merge branch 'DarkflameUniverse:main' into pr-improvements
This commit is contained in:
		@@ -95,7 +95,7 @@ if (__include_backtrace__ AND __compile_backtrace__)
 | 
			
		||||
 | 
			
		||||
    link_directories(${backtrace_SOURCE_DIR}/.libs/)
 | 
			
		||||
    include_directories(${backtrace_SOURCE_DIR})
 | 
			
		||||
endif(__include_backtrace__ AND __compile_backtrace__)
 | 
			
		||||
endif(__include_backtrace__)
 | 
			
		||||
 | 
			
		||||
endif()
 | 
			
		||||
endif(UNIX)
 | 
			
		||||
 
 | 
			
		||||
@@ -1222,19 +1222,13 @@ void Entity::UpdateXMLDoc(tinyxml2::XMLDocument* doc) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Entity::Update(const float deltaTime) {
 | 
			
		||||
	int timerSize = m_Timers.size();
 | 
			
		||||
	for (int i = 0; i < timerSize; i++) {
 | 
			
		||||
	for (int i = 0; i < m_Timers.size(); i++) {
 | 
			
		||||
		m_Timers[i]->Update(deltaTime);
 | 
			
		||||
		if (m_Timers[i]->GetTime() <= 0) {
 | 
			
		||||
			const auto timerName = m_Timers[i]->GetName();
 | 
			
		||||
 | 
			
		||||
			do { //sometimes, due to a race condition, m_Timers.erase doesn't actually erase, repeat until it does
 | 
			
		||||
				if (m_Timers[i]->GetName() != timerName) {
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				delete m_Timers[i];
 | 
			
		||||
				m_Timers.erase(m_Timers.begin() + i);
 | 
			
		||||
			} while (m_Timers.size() == timerSize); //timer size indicates whether it's actually successfully been erased or not
 | 
			
		||||
			delete m_Timers[i];
 | 
			
		||||
			m_Timers.erase(m_Timers.begin() + i);
 | 
			
		||||
 | 
			
		||||
			for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
 | 
			
		||||
				script->OnTimerDone(this, timerName);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,93 +0,0 @@
 | 
			
		||||
#include "AgShipShake.h"
 | 
			
		||||
#include "GeneralUtils.h"
 | 
			
		||||
#include "GameMessages.h"
 | 
			
		||||
#include "dZoneManager.h"
 | 
			
		||||
#include "EntityManager.h"
 | 
			
		||||
#include "Game.h"
 | 
			
		||||
 | 
			
		||||
void AgShipShake::OnStartup(Entity* self) {
 | 
			
		||||
	EntityInfo info{};
 | 
			
		||||
 | 
			
		||||
	info.pos = { -418, 585, -30 };
 | 
			
		||||
	info.lot = 33;
 | 
			
		||||
	info.spawnerID = self->GetObjectID();
 | 
			
		||||
 | 
			
		||||
	auto* ref = EntityManager::Instance()->CreateEntity(info);
 | 
			
		||||
 | 
			
		||||
	EntityManager::Instance()->ConstructEntity(ref);
 | 
			
		||||
 | 
			
		||||
	self->SetVar(u"ShakeObject", ref->GetObjectID());
 | 
			
		||||
 | 
			
		||||
	self->AddTimer("ShipShakeIdle", 1.0f);
 | 
			
		||||
	self->SetVar(u"RandomTime", 10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AgShipShake::OnTimerDone(Entity* self, std::string timerName) {
 | 
			
		||||
	if (timerName == "ShipShakeExplode") {
 | 
			
		||||
		DoShake(self, true);
 | 
			
		||||
	}
 | 
			
		||||
	else if (timerName == "ShipShakeIdle") {
 | 
			
		||||
		DoShake(self, false);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AgShipShake::DoShake(Entity* self, bool explodeIdle) {
 | 
			
		||||
	if (!explodeIdle) {
 | 
			
		||||
		auto* ref = EntityManager::Instance()->GetEntity(self->GetVar<LWOOBJID>(u"ShakeObject"));
 | 
			
		||||
 | 
			
		||||
		const auto randomTime = self->GetVar<int>(u"RandomTime");
 | 
			
		||||
		auto time = GeneralUtils::GenerateRandomNumber<int>(0, randomTime + 1);
 | 
			
		||||
 | 
			
		||||
		if (time < randomTime / 2) {
 | 
			
		||||
			time += randomTime / 2;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		self->AddTimer("ShipShakeIdle", static_cast<float>(time));
 | 
			
		||||
 | 
			
		||||
		if (ref)
 | 
			
		||||
			GameMessages::SendPlayEmbeddedEffectOnAllClientsNearObject(ref, FXName, ref->GetObjectID(), 500.0f);
 | 
			
		||||
 | 
			
		||||
		auto* debrisObject = GetEntityInGroup(DebrisFX);
 | 
			
		||||
 | 
			
		||||
		if (debrisObject)
 | 
			
		||||
			GameMessages::SendPlayFXEffect(debrisObject, -1, u"DebrisFall", "Debris", LWOOBJID_EMPTY, 1.0f, 1.0f, true);
 | 
			
		||||
 | 
			
		||||
		const auto randomFx = GeneralUtils::GenerateRandomNumber<int>(0, 3);
 | 
			
		||||
 | 
			
		||||
		auto* shipFxObject = GetEntityInGroup(ShipFX);
 | 
			
		||||
		if (shipFxObject) {
 | 
			
		||||
			std::string effectType = "shipboom" + std::to_string(randomFx);
 | 
			
		||||
			GameMessages::SendPlayFXEffect(shipFxObject, 559, GeneralUtils::ASCIIToUTF16(effectType), "FX", LWOOBJID_EMPTY, 1.0f, 1.0f, true);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		self->AddTimer("ShipShakeExplode", 5.0f);
 | 
			
		||||
 | 
			
		||||
		auto* shipFxObject2 = GetEntityInGroup(ShipFX2);
 | 
			
		||||
		if (shipFxObject2)
 | 
			
		||||
			GameMessages::SendPlayAnimation(shipFxObject2, u"explosion");
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		auto* shipFxObject = GetEntityInGroup(ShipFX);
 | 
			
		||||
		auto* shipFxObject2 = GetEntityInGroup(ShipFX2);
 | 
			
		||||
 | 
			
		||||
		if (shipFxObject)
 | 
			
		||||
			GameMessages::SendPlayAnimation(shipFxObject, u"idle");
 | 
			
		||||
 | 
			
		||||
		if (shipFxObject2)
 | 
			
		||||
			GameMessages::SendPlayAnimation(shipFxObject2, u"idle");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Entity* AgShipShake::GetEntityInGroup(const std::string& group) {
 | 
			
		||||
	auto entities = EntityManager::Instance()->GetEntitiesInGroup(group);
 | 
			
		||||
	Entity* en = nullptr;
 | 
			
		||||
 | 
			
		||||
	for (auto entity : entities) {
 | 
			
		||||
		if (entity) {
 | 
			
		||||
			en = entity;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return en;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "CppScripts.h"
 | 
			
		||||
 | 
			
		||||
class AgShipShake : public CppScripts::Script {
 | 
			
		||||
public:
 | 
			
		||||
	void OnStartup(Entity* self);
 | 
			
		||||
	void OnTimerDone(Entity* self, std::string timerName);
 | 
			
		||||
	void DoShake(Entity* self, bool explodeIdle);
 | 
			
		||||
 | 
			
		||||
	std::string DebrisFX = "DebrisFX";
 | 
			
		||||
	std::string ShipFX = "ShipFX";
 | 
			
		||||
	std::string ShipFX2 = "ShipFX2";
 | 
			
		||||
	std::u16string FXName = u"camshake-bridge";
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	Entity* GetEntityInGroup(const std::string& group);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
#include "AgSpaceStuff.h"
 | 
			
		||||
#include "GeneralUtils.h"
 | 
			
		||||
#include "GameMessages.h"
 | 
			
		||||
#include "dZoneManager.h"
 | 
			
		||||
#include "EntityManager.h"
 | 
			
		||||
#include "Game.h"
 | 
			
		||||
 | 
			
		||||
@@ -16,6 +17,11 @@ void AgSpaceStuff::OnStartup(Entity* self) {
 | 
			
		||||
	auto* ref = EntityManager::Instance()->CreateEntity(info);
 | 
			
		||||
 | 
			
		||||
	EntityManager::Instance()->ConstructEntity(ref);
 | 
			
		||||
 | 
			
		||||
	self->SetVar(u"ShakeObject", ref->GetObjectID());
 | 
			
		||||
 | 
			
		||||
	self->AddTimer("ShipShakeIdle", 1.0f);
 | 
			
		||||
	self->SetVar(u"RandomTime", 10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AgSpaceStuff::OnTimerDone(Entity* self, std::string timerName) {
 | 
			
		||||
@@ -32,4 +38,72 @@ void AgSpaceStuff::OnTimerDone(Entity* self, std::string timerName) {
 | 
			
		||||
		GameMessages::SendPlayAnimation(self, u"path_0" + (GeneralUtils::to_u16string(pathType)));
 | 
			
		||||
		self->AddTimer("FloaterScale", randTime);
 | 
			
		||||
	}
 | 
			
		||||
	else if (timerName == "ShipShakeExplode") {
 | 
			
		||||
		DoShake(self, true);
 | 
			
		||||
	}
 | 
			
		||||
	else if (timerName == "ShipShakeIdle") {
 | 
			
		||||
		DoShake(self, false);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AgSpaceStuff::DoShake(Entity* self, bool explodeIdle) {
 | 
			
		||||
 | 
			
		||||
	if (!explodeIdle) {
 | 
			
		||||
		auto* ref = EntityManager::Instance()->GetEntity(self->GetVar<LWOOBJID>(u"ShakeObject"));
 | 
			
		||||
 | 
			
		||||
		const auto randomTime = self->GetVar<int>(u"RandomTime");
 | 
			
		||||
		auto time = GeneralUtils::GenerateRandomNumber<int>(0, randomTime + 1);
 | 
			
		||||
 | 
			
		||||
		if (time < randomTime / 2) {
 | 
			
		||||
			time += randomTime / 2;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		self->AddTimer("ShipShakeIdle", static_cast<float>(time));
 | 
			
		||||
 | 
			
		||||
		if (ref)
 | 
			
		||||
			GameMessages::SendPlayEmbeddedEffectOnAllClientsNearObject(ref, FXName, ref->GetObjectID(), 500.0f);
 | 
			
		||||
 | 
			
		||||
		auto* debrisObject = GetEntityInGroup(DebrisFX);
 | 
			
		||||
 | 
			
		||||
		if (debrisObject)
 | 
			
		||||
			GameMessages::SendPlayFXEffect(debrisObject, -1, u"DebrisFall", "Debris", LWOOBJID_EMPTY, 1.0f, 1.0f, true);
 | 
			
		||||
 | 
			
		||||
		const auto randomFx = GeneralUtils::GenerateRandomNumber<int>(0, 3);
 | 
			
		||||
 | 
			
		||||
		auto* shipFxObject = GetEntityInGroup(ShipFX);
 | 
			
		||||
		if (shipFxObject) {
 | 
			
		||||
			std::string effectType = "shipboom" + std::to_string(randomFx);
 | 
			
		||||
			GameMessages::SendPlayFXEffect(shipFxObject, 559, GeneralUtils::ASCIIToUTF16(effectType), "FX", LWOOBJID_EMPTY, 1.0f, 1.0f, true);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		self->AddTimer("ShipShakeExplode", 5.0f);
 | 
			
		||||
 | 
			
		||||
		auto* shipFxObject2 = GetEntityInGroup(ShipFX2);
 | 
			
		||||
		if (shipFxObject2)
 | 
			
		||||
			GameMessages::SendPlayAnimation(shipFxObject2, u"explosion");
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		auto* shipFxObject = GetEntityInGroup(ShipFX);
 | 
			
		||||
		auto* shipFxObject2 = GetEntityInGroup(ShipFX2);
 | 
			
		||||
 | 
			
		||||
		if (shipFxObject)
 | 
			
		||||
			GameMessages::SendPlayAnimation(shipFxObject, u"idle");
 | 
			
		||||
 | 
			
		||||
		if (shipFxObject2)
 | 
			
		||||
			GameMessages::SendPlayAnimation(shipFxObject2, u"idle");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Entity* AgSpaceStuff::GetEntityInGroup(const std::string& group) {
 | 
			
		||||
	auto entities = EntityManager::Instance()->GetEntitiesInGroup(group);
 | 
			
		||||
	Entity* en = nullptr;
 | 
			
		||||
 | 
			
		||||
	for (auto entity : entities) {
 | 
			
		||||
		if (entity) {
 | 
			
		||||
			en = entity;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return en;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,4 +5,14 @@ class AgSpaceStuff : public CppScripts::Script {
 | 
			
		||||
public:
 | 
			
		||||
	void OnStartup(Entity* self);
 | 
			
		||||
	void OnTimerDone(Entity* self, std::string timerName);
 | 
			
		||||
	void DoShake(Entity* self, bool explodeIdle);
 | 
			
		||||
 | 
			
		||||
	std::string DebrisFX = "DebrisFX";
 | 
			
		||||
	std::string ShipFX = "ShipFX";
 | 
			
		||||
	std::string ShipFX2 = "ShipFX2";
 | 
			
		||||
	std::u16string FXName = u"camshake-bridge";
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	Entity* GetEntityInGroup(const std::string& group);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@
 | 
			
		||||
//VE / AG scripts:
 | 
			
		||||
#include "AgShipPlayerDeathTrigger.h"
 | 
			
		||||
#include "AgShipPlayerShockServer.h"
 | 
			
		||||
#include "AgShipShake.h"
 | 
			
		||||
#include "AgSpaceStuff.h"
 | 
			
		||||
#include "AgImagSmashable.h"
 | 
			
		||||
#include "NpcNpSpacemanBob.h"
 | 
			
		||||
@@ -291,9 +290,7 @@ CppScripts::Script* CppScripts::GetScript(Entity* parent, const std::string& scr
 | 
			
		||||
		script = new AgShipPlayerDeathTrigger();
 | 
			
		||||
	else if (scriptName == "scripts\\ai\\NP\\L_NPC_NP_SPACEMAN_BOB.lua")
 | 
			
		||||
		script = new NpcNpSpacemanBob();
 | 
			
		||||
	else if (scriptName == "scripts\\ai\\AG\\L_AG_SHIP_SHAKE.lua")
 | 
			
		||||
		script = new AgShipShake();
 | 
			
		||||
	else if (scriptName == "scripts\\ai\\AG\\L_AG_SPACE_STUFF.lua")
 | 
			
		||||
	else if (scriptName == "scripts\\ai\\AG\\L_AG_SPACE_STUFF.lua") // Broken, will (sometimes) display all animations at once on initial login
 | 
			
		||||
		script = new AgSpaceStuff();
 | 
			
		||||
	else if (scriptName == "scripts\\ai\\AG\\L_AG_SHIP_PLAYER_SHOCK_SERVER.lua")
 | 
			
		||||
		script = new AgShipPlayerShockServer();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user