Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/scripting/StarWorldLuaBindings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/scripting/StarWorldLuaBindings.cpp')
-rw-r--r--source/game/scripting/StarWorldLuaBindings.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/source/game/scripting/StarWorldLuaBindings.cpp b/source/game/scripting/StarWorldLuaBindings.cpp
index f5d9172..b2c94a4 100644
--- a/source/game/scripting/StarWorldLuaBindings.cpp
+++ b/source/game/scripting/StarWorldLuaBindings.cpp
@@ -599,6 +599,8 @@ namespace LuaBindings {
callbacks.registerCallbackWithSignature<bool, List<Vec2I>, String, Vec2F, String, float, Maybe<unsigned>, Maybe<EntityId>>("damageTiles", bind(WorldEnvironmentCallbacks::damageTiles, world, _1, _2, _3, _4, _5, _6, _7));
callbacks.registerCallbackWithSignature<bool, Vec2F, float, String, Vec2F, String, float, Maybe<unsigned>, Maybe<EntityId>>("damageTileArea", bind(WorldEnvironmentCallbacks::damageTileArea, world, _1, _2, _3, _4, _5, _6, _7, _8));
callbacks.registerCallbackWithSignature<bool, Vec2I, String, String, Maybe<int>, bool>("placeMaterial", bind(WorldEnvironmentCallbacks::placeMaterial, world, _1, _2, _3, _4, _5));
+ callbacks.registerCallbackWithSignature<bool, List<Vec2I>, String, String, Maybe<int>, bool>("replaceMaterials", bind(WorldEnvironmentCallbacks::replaceMaterials, world, _1, _2, _3, _4, _5));
+ callbacks.registerCallbackWithSignature<bool, Vec2F, float, String, String, Maybe<int>, bool>("replaceMaterialArea", bind(WorldEnvironmentCallbacks::replaceMaterialArea, world, _1, _2, _3, _4, _5, _6));
callbacks.registerCallbackWithSignature<bool, Vec2I, String, String, Maybe<int>, bool>("placeMod", bind(WorldEnvironmentCallbacks::placeMod, world, _1, _2, _3, _4, _5));
callbacks.registerCallback("radialTileQuery", [world](Vec2F center, float radius, String layerName) -> List<Vec2I> {
@@ -2019,6 +2021,76 @@ namespace LuaBindings {
return world->modifyTile(tilePosition, placeMaterial, allowOverlap);
}
+ bool WorldEnvironmentCallbacks::replaceMaterials(World* world,
+ List<Vec2I> const& tilePositions,
+ String const& layer,
+ String const& materialName,
+ Maybe<int> const& hueShift,
+ bool enableDrops) {
+ PlaceMaterial placeMaterial;
+
+ std::string layerName = layer.utf8();
+ auto split = layerName.find_first_of('+');
+ if (split != NPos) {
+ auto overrideName = layerName.substr(split + 1);
+ layerName = layerName.substr(0, split);
+ if (overrideName == "empty" || overrideName == "none")
+ placeMaterial.collisionOverride = TileCollisionOverride::Empty;
+ else if (overrideName == "block")
+ placeMaterial.collisionOverride = TileCollisionOverride::Block;
+ else if (overrideName == "platform")
+ placeMaterial.collisionOverride = TileCollisionOverride::Platform;
+ else
+ throw StarException(strf("Unsupported collision override {}", overrideName));
+ }
+
+ if (layerName == "foreground")
+ placeMaterial.layer = TileLayer::Foreground;
+ else if (layerName == "background")
+ placeMaterial.layer = TileLayer::Background;
+ else
+ throw StarException(strf("Unsupported tile layer {}", layerName));
+
+ auto materialDatabase = Root::singleton().materialDatabase();
+ if (!materialDatabase->materialNames().contains(materialName))
+ throw StarException(strf("Unknown material name {}", materialName));
+ placeMaterial.material = materialDatabase->materialId(materialName);
+
+ if (hueShift)
+ placeMaterial.materialHueShift = (MaterialHue)*hueShift;
+
+ TileModificationList modifications;
+ for (auto pos : tilePositions) {
+ if (!world->isTileConnectable(pos, placeMaterial.layer, true))
+ continue;
+ modifications.emplaceAppend(pos, placeMaterial);
+ }
+
+ if (modifications.empty())
+ return true;
+
+ TileDamage damage;
+ if (enableDrops) {
+ damage.amount = 1.0f;
+ damage.harvestLevel = 999;
+ } else {
+ damage.amount = -1.0f;
+ }
+
+ return world->replaceTiles(modifications, damage).empty();;
+ }
+
+ bool WorldEnvironmentCallbacks::replaceMaterialArea(World* world,
+ Vec2F center,
+ float radius,
+ String const& layer,
+ String const& materialName,
+ Maybe<int> const& hueShift,
+ bool enableDrops) {
+ auto tiles = tileAreaBrush(radius, center, false);
+ return replaceMaterials(world, tiles, layer, materialName, hueShift, enableDrops);
+ }
+
bool WorldEnvironmentCallbacks::placeMod(World* world, Vec2I const& arg1, String const& arg2, String const& arg3, Maybe<int> const& arg4, bool arg5) {
auto tilePosition = arg1;