diff --git a/doc/changelog.txt b/doc/changelog.txt index e3258451202..1251cd69f52 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -116,6 +116,10 @@ Lua: - Added VFS.GetFileAbsolutePath(string vfsFilePath) -> string filePathOnDisk - Added VFS.GetArchiveContainingFile(string vfsFilePath) -> string archiveName - add a 6th return value (feature->reclaimTime) to GetFeatureResources. + - Allow spawning of any CEG from any LUS: + EmitSFX("cegTag") param will emit the CEG with tag="cegTag" + EmitSFX(SFX.ABSOLUTE & cegID) will emit the CEG with id=cegID + Added Spring.GetCEGID("cegTag") to return CEG id from tag AI: diff --git a/rts/Lua/LuaConstCOB.cpp b/rts/Lua/LuaConstCOB.cpp index 105a8ff2988..543e96544c7 100644 --- a/rts/Lua/LuaConstCOB.cpp +++ b/rts/Lua/LuaConstCOB.cpp @@ -142,6 +142,7 @@ bool LuaConstSFX::PushEntries(lua_State* L) LuaPushNamedNumber(L, "CEG", SFX_CEG); LuaPushNamedNumber(L, "FIRE_WEAPON", SFX_FIRE_WEAPON); LuaPushNamedNumber(L, "DETONATE_WEAPON", SFX_DETONATE_WEAPON); + LuaPushNamedNumber(L, "ABSOLUTE", SFX_ABSOLUTE); return true; } diff --git a/rts/Lua/LuaSyncedRead.cpp b/rts/Lua/LuaSyncedRead.cpp index c3b26488590..650c240c8a1 100644 --- a/rts/Lua/LuaSyncedRead.cpp +++ b/rts/Lua/LuaSyncedRead.cpp @@ -45,6 +45,7 @@ #include "Sim/MoveTypes/StaticMoveType.h" #include "Sim/MoveTypes/MoveDefHandler.h" #include "Sim/Path/IPathManager.h" +#include "Sim/Projectiles/ExplosionGenerator.h" #include "Sim/Projectiles/Projectile.h" #include "Sim/Projectiles/PieceProjectile.h" #include "Sim/Projectiles/WeaponProjectiles/WeaponProjectile.h" @@ -260,6 +261,8 @@ bool LuaSyncedRead::PushEntries(lua_State* L) REGISTER_LUA_CFUNC(GetUnitRulesParam); REGISTER_LUA_CFUNC(GetUnitRulesParams); + REGISTER_LUA_CFUNC(GetCEGID); + REGISTER_LUA_CFUNC(GetAllFeatures); REGISTER_LUA_CFUNC(GetFeatureDefID); REGISTER_LUA_CFUNC(GetFeatureTeam); @@ -3971,6 +3974,15 @@ int LuaSyncedRead::GetUnitDefDimensions(lua_State* L) } +int LuaSyncedRead::GetCEGID(lua_State* L) +{ + const unsigned int cegID = explGenHandler.LoadGeneratorID(std::string(CEG_PREFIX_STRING) + lua_tostring(L, 1)); + + lua_pushnumber(L, cegID); + return 1; +} + + int LuaSyncedRead::GetUnitBlocking(lua_State* L) { return (GetSolidObjectBlocking(L, ParseTypedUnit(L, __func__, 1))); diff --git a/rts/Lua/LuaSyncedRead.h b/rts/Lua/LuaSyncedRead.h index 6d5ec04dfbe..5dc2236c8f0 100644 --- a/rts/Lua/LuaSyncedRead.h +++ b/rts/Lua/LuaSyncedRead.h @@ -172,6 +172,8 @@ class LuaSyncedRead { static int GetUnitFeatureSeparation(lua_State* L); static int GetUnitDefDimensions(lua_State* L); + static int GetCEGID(lua_State* L); + static int GetAllFeatures(lua_State* L); static int ValidFeatureID(lua_State* L); diff --git a/rts/Sim/Units/Scripts/CobDefines.h b/rts/Sim/Units/Scripts/CobDefines.h index a23efe69fca..c36d3c0e0c5 100644 --- a/rts/Sim/Units/Scripts/CobDefines.h +++ b/rts/Sim/Units/Scripts/CobDefines.h @@ -18,6 +18,7 @@ #define SFX_CEG 1024 #define SFX_FIRE_WEAPON 2048 #define SFX_DETONATE_WEAPON 4096 +#define SFX_ABSOLUTE 16384 // Indices for set/get value diff --git a/rts/Sim/Units/Scripts/LuaUnitScript.cpp b/rts/Sim/Units/Scripts/LuaUnitScript.cpp index 5f8393f78ff..0d4932f38f2 100644 --- a/rts/Sim/Units/Scripts/LuaUnitScript.cpp +++ b/rts/Sim/Units/Scripts/LuaUnitScript.cpp @@ -4,6 +4,7 @@ #include "LuaUnitScript.h" +#include "CobDefines.h" #include "CobInstance.h" #include "LuaInclude.h" #include "NullUnitScript.h" @@ -13,6 +14,7 @@ #include "Lua/LuaCallInCheck.h" #include "Lua/LuaHandleSynced.h" #include "Lua/LuaUtils.h" +#include "Sim/Projectiles/ExplosionGenerator.h" #include "Sim/Units/UnitHandler.h" #include "Sim/Units/Unit.h" #include "Sim/Weapons/PlasmaRepulser.h" @@ -1195,7 +1197,13 @@ int CLuaUnitScript::EmitSfx(lua_State* L) // note: the arguments are reversed compared to the C++ (and COB?) function const int piece = luaL_checkint(L, 1) - 1; - const int type = luaL_checkint(L, 2); + int type = CExplosionGeneratorHandler::EXPGEN_ID_INVALID; + + if (lua_isstring(L, 2)) { + type = explGenHandler.LoadGeneratorID(std::string(CEG_PREFIX_STRING) + lua_tostring(L, 2)) & SFX_ABSOLUTE; + } else { + type = luaL_checkint(L, 2); + } activeScript->EmitSfx(type, piece); return 0; diff --git a/rts/Sim/Units/Scripts/UnitScript.cpp b/rts/Sim/Units/Scripts/UnitScript.cpp index 0c5672c235f..5a550f80897 100644 --- a/rts/Sim/Units/Scripts/UnitScript.cpp +++ b/rts/Sim/Units/Scripts/UnitScript.cpp @@ -551,6 +551,12 @@ bool CUnitScript::EmitAbsSFX(int sfxType, const float3& absPos, const float3& ab } break; default: { + if ((sfxType & SFX_ABSOLUTE) != 0) { + // emit defined explosion-generator (can only be custom, not standard) + // index is made valid by callee, an ID of -1 means CEG failed to load + explGenHandler.GenExplosion(sfxType - SFX_ABSOLUTE, absPos, absDir, unit->cegDamage, 1.0f, 0.0f, unit, nullptr); + return true; + } if ((sfxType & SFX_CEG) != 0) { // emit defined explosion-generator (can only be custom, not standard) // index is made valid by callee, an ID of -1 means CEG failed to load