mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-11-04 06:32:00 +00:00 
			
		
		
		
	Merge remote-tracking branch 'origin/main' into nejlika
This commit is contained in:
		@@ -31,7 +31,7 @@ COPY --from=build /app/build/*Server /app/
 | 
			
		||||
 | 
			
		||||
# Necessary suplimentary files
 | 
			
		||||
COPY --from=build /app/build/*.ini /app/configs/
 | 
			
		||||
COPY --from=build /app/build/vanity/*.* /app/vanity/*
 | 
			
		||||
COPY --from=build /app/build/vanity/*.* /app/vanity/
 | 
			
		||||
COPY --from=build /app/build/navmeshes /app/navmeshes
 | 
			
		||||
COPY --from=build /app/build/migrations /app/migrations
 | 
			
		||||
COPY --from=build /app/build/*.dcf /app/
 | 
			
		||||
@@ -39,7 +39,7 @@ COPY --from=build /app/build/*.dcf /app/
 | 
			
		||||
# backup of config and vanity files to copy to the host incase 
 | 
			
		||||
# of a mount clobbering the copy from above
 | 
			
		||||
COPY --from=build /app/build/*.ini /app/default-configs/ 
 | 
			
		||||
COPY --from=build /app/build/vanity/*.* /app/default-vanity/*
 | 
			
		||||
COPY --from=build /app/build/vanity/*.* /app/default-vanity/
 | 
			
		||||
 | 
			
		||||
# needed as the container runs with the root user
 | 
			
		||||
# and therefore sudo doesn't exist
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
#include "LeaderboardManager.h"
 | 
			
		||||
#include "dZoneManager.h"
 | 
			
		||||
#include "CDActivitiesTable.h"
 | 
			
		||||
#include "eStateChangeType.h"
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
#ifndef M_PI
 | 
			
		||||
@@ -77,6 +78,9 @@ void RacingControlComponent::OnPlayerLoaded(Entity* player) {
 | 
			
		||||
 | 
			
		||||
	m_LoadedPlayers++;
 | 
			
		||||
 | 
			
		||||
	// not live accurate to stun the player but prevents them from using skills during the race that are not meant to be used.
 | 
			
		||||
	GameMessages::SendSetStunned(player->GetObjectID(), eStateChangeType::PUSH, player->GetSystemAddress(), LWOOBJID_EMPTY, true, true, true, true, true, true, true, true, true);
 | 
			
		||||
 | 
			
		||||
	LOG("Loading player %i",
 | 
			
		||||
		m_LoadedPlayers);
 | 
			
		||||
	m_LobbyPlayers.push_back(player->GetObjectID());
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@
 | 
			
		||||
#include "SkillComponent.h"
 | 
			
		||||
#include "eReplicaComponentType.h"
 | 
			
		||||
#include "RenderComponent.h"
 | 
			
		||||
#include "PlayerManager.h"
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
@@ -53,11 +54,13 @@ void BossSpiderQueenEnemyServer::OnStartup(Entity* self) {
 | 
			
		||||
 | 
			
		||||
void BossSpiderQueenEnemyServer::OnDie(Entity* self, Entity* killer) {
 | 
			
		||||
	if (Game::zoneManager->GetZoneID().GetMapID() == instanceZoneID && killer) {
 | 
			
		||||
		auto* missionComponent = killer->GetComponent<MissionComponent>();
 | 
			
		||||
		if (missionComponent == nullptr)
 | 
			
		||||
			return;
 | 
			
		||||
		for (const auto& player : PlayerManager::GetAllPlayers()) {
 | 
			
		||||
			auto* missionComponent = player->GetComponent<MissionComponent>();
 | 
			
		||||
			if (missionComponent == nullptr)
 | 
			
		||||
				return;
 | 
			
		||||
 | 
			
		||||
		missionComponent->CompleteMission(instanceMissionID);
 | 
			
		||||
			missionComponent->CompleteMission(instanceMissionID);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// There is suppose to be a 0.1 second delay here but that may be admitted?
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
#include "AgShipPlayerDeathTrigger.h"
 | 
			
		||||
#include "AgShipPlayerShockServer.h"
 | 
			
		||||
#include "AgSpaceStuff.h"
 | 
			
		||||
#include "AgShipShake.h"
 | 
			
		||||
#include "AgImagSmashable.h"
 | 
			
		||||
#include "NpcNpSpacemanBob.h"
 | 
			
		||||
#include "StoryBoxInteractServer.h"
 | 
			
		||||
@@ -341,6 +342,7 @@ namespace {
 | 
			
		||||
		{ "scripts\\ai\\AG\\L_AG_SHIP_PLAYER_DEATH_TRIGGER.lua", []() { return new AgShipPlayerDeathTrigger(); } },
 | 
			
		||||
		{"scripts\\ai\\NP\\L_NPC_NP_SPACEMAN_BOB.lua", []() { return new NpcNpSpacemanBob(); } },
 | 
			
		||||
		{"scripts\\ai\\AG\\L_AG_SPACE_STUFF.lua", []() { return new AgSpaceStuff();} },
 | 
			
		||||
		{"scripts\\ai\\AG\\L_AG_SHIP_SHAKE.lua", []() { return new AgShipShake();}},
 | 
			
		||||
		{"scripts\\ai\\AG\\L_AG_SHIP_PLAYER_SHOCK_SERVER.lua", []() { return new AgShipPlayerShockServer();} },
 | 
			
		||||
		{"scripts\\ai\\AG\\L_AG_IMAG_SMASHABLE.lua", []() { return new AgImagSmashable();} },
 | 
			
		||||
		{"scripts\\02_server\\Map\\General\\L_STORY_BOX_INTERACT_SERVER.lua", []() { return new StoryBoxInteractServer();} },
 | 
			
		||||
@@ -580,6 +582,7 @@ namespace {
 | 
			
		||||
		{"scripts\\02_server\\Map\\AM\\L_SKULLKIN_DRILL_STAND.lua", []() {return new AmSkullkinDrillStand();}},
 | 
			
		||||
		{"scripts\\02_server\\Map\\AM\\L_SKULLKIN_TOWER.lua", []() {return new AmSkullkinTower();}},
 | 
			
		||||
		{"scripts\\02_server\\Enemy\\AM\\L_AM_NAMED_DARKLING_DRAGON.lua", []() {return new AmDarklingDragon();}},
 | 
			
		||||
		{"scripts\\02_server\\Enemy\\AM\\L_AM_DARKLING_DRAGON.lua", []() {return new AmDarklingDragon();}},
 | 
			
		||||
		{"scripts\\02_server\\Enemy\\AM\\L_AM_DARKLING_APE.lua", []() {return new BaseEnemyApe();}},
 | 
			
		||||
		{"scripts\\02_server\\Map\\AM\\L_BLUE_X.lua", []() {return new AmBlueX();}},
 | 
			
		||||
		{"scripts\\02_server\\Map\\AM\\L_TEAPOT_SERVER.lua", []() {return new AmTeapotServer();}},
 | 
			
		||||
@@ -654,6 +657,7 @@ namespace {
 | 
			
		||||
 | 
			
		||||
		//Pickups
 | 
			
		||||
		{"scripts\\ai\\SPEC\\L_SPECIAL_1_BRONZE-COIN-SPAWNER.lua", []() {return new SpecialCoinSpawner(1);}},
 | 
			
		||||
		{"scripts\\ai\\SPEC\\L_SPECIAL_1_GOLD-COIN-SPAWNER.lua", []() {return new SpecialCoinSpawner(10000);}},
 | 
			
		||||
		{"scripts\\ai\\SPEC\\L_SPECIAL_1_SILVER-COIN-SPAWNER.lua", []() {return new SpecialCoinSpawner(100);}},
 | 
			
		||||
		{"scripts\\ai\\SPEC\\L_SPECIAL_10_BRONZE-COIN-SPAWNER.lua", []() {return new SpecialCoinSpawner(10);}},
 | 
			
		||||
		{"scripts\\ai\\SPEC\\L_SPECIAL_10_GOLD-COIN-SPAWNER.lua", []() {return new SpecialCoinSpawner(100000);}},
 | 
			
		||||
@@ -700,7 +704,8 @@ CppScripts::Script* const CppScripts::GetScript(Entity* parent, const std::strin
 | 
			
		||||
			(scriptName == "scripts\\02_server\\Enemy\\General\\L_BASE_ENEMY_SPIDERLING.lua") ||
 | 
			
		||||
			(scriptName == "scripts\\ai\\FV\\L_ACT_NINJA_STUDENT.lua") ||
 | 
			
		||||
			(scriptName == "scripts\\ai\\WILD\\L_WILD_GF_FROG.lua") ||
 | 
			
		||||
			(scriptName == "scripts\\empty.lua")
 | 
			
		||||
			(scriptName == "scripts\\empty.lua") ||
 | 
			
		||||
			(scriptName == "scripts\\ai\\AG\\L_AG_SENTINEL_GUARD.lua")
 | 
			
		||||
			)) LOG_DEBUG("LOT %i attempted to load CppScript for '%s', but returned InvalidScript.", parent->GetLOT(), scriptName.c_str());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										81
									
								
								dScripts/ai/AG/AgShipShake.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								dScripts/ai/AG/AgShipShake.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
#include "AgShipShake.h"
 | 
			
		||||
#include "EntityInfo.h"
 | 
			
		||||
#include "GeneralUtils.h"
 | 
			
		||||
#include "GameMessages.h"
 | 
			
		||||
#include "EntityManager.h"
 | 
			
		||||
#include "RenderComponent.h"
 | 
			
		||||
#include "Entity.h"
 | 
			
		||||
 | 
			
		||||
void AgShipShake::OnStartup(Entity* self) {
 | 
			
		||||
	EntityInfo info{};
 | 
			
		||||
 | 
			
		||||
	info.pos = { -418, 585, -30 };
 | 
			
		||||
	info.lot = 33;
 | 
			
		||||
	info.spawnerID = self->GetObjectID();
 | 
			
		||||
 | 
			
		||||
	auto* ref = Game::entityManager->CreateEntity(info);
 | 
			
		||||
 | 
			
		||||
	Game::entityManager->ConstructEntity(ref);
 | 
			
		||||
 | 
			
		||||
	self->SetVar(u"ShakeObject", ref->GetObjectID());
 | 
			
		||||
 | 
			
		||||
	self->AddTimer("ShipShakeIdle", 2.0f);
 | 
			
		||||
	self->SetVar(u"RandomTime", 10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AgShipShake::OnTimerDone(Entity* self, std::string timerName) {
 | 
			
		||||
	auto* shipFxObject = GetEntityInGroup(ShipFX);
 | 
			
		||||
	auto* shipFxObject2 = GetEntityInGroup(ShipFX2);
 | 
			
		||||
	auto* debrisObject = GetEntityInGroup(DebrisFX);
 | 
			
		||||
	if (timerName == "ShipShakeIdle") {
 | 
			
		||||
		auto* ref = Game::entityManager->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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		if (debrisObject)
 | 
			
		||||
			GameMessages::SendPlayFXEffect(debrisObject, -1, u"DebrisFall", "Debris", LWOOBJID_EMPTY, 1.0f, 1.0f, true);
 | 
			
		||||
 | 
			
		||||
		const auto randomFx = GeneralUtils::GenerateRandomNumber<int>(0, 3);
 | 
			
		||||
 | 
			
		||||
		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);
 | 
			
		||||
 | 
			
		||||
		if (shipFxObject2)
 | 
			
		||||
			RenderComponent::PlayAnimation(shipFxObject2, u"explosion");
 | 
			
		||||
	} else if (timerName == "ShipShakeExplode") {
 | 
			
		||||
		if (shipFxObject)
 | 
			
		||||
			RenderComponent::PlayAnimation(shipFxObject, u"idle");
 | 
			
		||||
		if (shipFxObject2)
 | 
			
		||||
			RenderComponent::PlayAnimation(shipFxObject2, u"idle");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Entity* AgShipShake::GetEntityInGroup(const std::string& group) {
 | 
			
		||||
	auto entities = Game::entityManager->GetEntitiesInGroup(group);
 | 
			
		||||
	Entity* en = nullptr;
 | 
			
		||||
 | 
			
		||||
	for (auto entity : entities) {
 | 
			
		||||
		if (entity) {
 | 
			
		||||
			en = entity;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return en;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								dScripts/ai/AG/AgShipShake.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								dScripts/ai/AG/AgShipShake.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "CppScripts.h"
 | 
			
		||||
 | 
			
		||||
class AgShipShake : public CppScripts::Script {
 | 
			
		||||
public:
 | 
			
		||||
	void OnStartup(Entity* self) override;
 | 
			
		||||
	void OnTimerDone(Entity* self, std::string timerName) override;
 | 
			
		||||
 | 
			
		||||
	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);
 | 
			
		||||
};
 | 
			
		||||
@@ -8,21 +8,6 @@
 | 
			
		||||
 | 
			
		||||
void AgSpaceStuff::OnStartup(Entity* self) {
 | 
			
		||||
	self->AddTimer("FloaterScale", 5.0f);
 | 
			
		||||
 | 
			
		||||
	EntityInfo info{};
 | 
			
		||||
 | 
			
		||||
	info.pos = { -418, 585, -30 };
 | 
			
		||||
	info.lot = 33;
 | 
			
		||||
	info.spawnerID = self->GetObjectID();
 | 
			
		||||
 | 
			
		||||
	auto* ref = Game::entityManager->CreateEntity(info);
 | 
			
		||||
 | 
			
		||||
	Game::entityManager->ConstructEntity(ref);
 | 
			
		||||
 | 
			
		||||
	self->SetVar(u"ShakeObject", ref->GetObjectID());
 | 
			
		||||
 | 
			
		||||
	self->AddTimer("ShipShakeIdle", 2.0f);
 | 
			
		||||
	self->SetVar(u"RandomTime", 10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AgSpaceStuff::OnTimerDone(Entity* self, std::string timerName) {
 | 
			
		||||
@@ -37,70 +22,5 @@ void AgSpaceStuff::OnTimerDone(Entity* self, std::string timerName) {
 | 
			
		||||
 | 
			
		||||
		RenderComponent::PlayAnimation(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 = Game::entityManager->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)
 | 
			
		||||
			RenderComponent::PlayAnimation(shipFxObject2, u"explosion");
 | 
			
		||||
	} else {
 | 
			
		||||
		auto* shipFxObject = GetEntityInGroup(ShipFX);
 | 
			
		||||
		auto* shipFxObject2 = GetEntityInGroup(ShipFX2);
 | 
			
		||||
 | 
			
		||||
		if (shipFxObject)
 | 
			
		||||
			RenderComponent::PlayAnimation(shipFxObject, u"idle");
 | 
			
		||||
 | 
			
		||||
		if (shipFxObject2)
 | 
			
		||||
			RenderComponent::PlayAnimation(shipFxObject2, u"idle");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Entity* AgSpaceStuff::GetEntityInGroup(const std::string& group) {
 | 
			
		||||
	auto entities = Game::entityManager->GetEntitiesInGroup(group);
 | 
			
		||||
	Entity* en = nullptr;
 | 
			
		||||
 | 
			
		||||
	for (auto entity : entities) {
 | 
			
		||||
		if (entity) {
 | 
			
		||||
			en = entity;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return en;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,14 +5,5 @@ 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);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
set(DSCRIPTS_SOURCES_AI_AG 
 | 
			
		||||
	"AgShipPlayerDeathTrigger.cpp"
 | 
			
		||||
	"AgSpaceStuff.cpp"
 | 
			
		||||
    "AgShipShake.cpp"
 | 
			
		||||
	"AgShipPlayerShockServer.cpp"
 | 
			
		||||
	"AgImagSmashable.cpp"
 | 
			
		||||
	"ActSharkPlayerDeathTrigger.cpp"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user