diff --git a/assets/behaviors/angryCitizen.behavior b/assets/behaviors/angryCitizen.behavior deleted file mode 100644 index a05b6573..00000000 --- a/assets/behaviors/angryCitizen.behavior +++ /dev/null @@ -1,40 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:FindNearbyPlayers", - values: ["N charactersWithinRange nonEmpty"], - child: { - sequence: [ - { - sleep: { - time: 0.1f - } - }, - followCharacter, - { - lookup: { - tree: "Behaviors:hostile" - } - } - ] - } - } - }, - { - sequence: [ - check_nighttime, - { - lookup: { - tree: "MetalRenegades:returnHome" - } - } - ] - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - ] -} diff --git a/assets/behaviors/friendlyCitizen.behavior b/assets/behaviors/friendlyCitizen.behavior deleted file mode 100644 index 3b1527ce..00000000 --- a/assets/behaviors/friendlyCitizen.behavior +++ /dev/null @@ -1,40 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:FindNearbyPlayers", - values: ["N charactersWithinRange nonEmpty"], - child: { - sequence: [ - { - sleep: { - time: 0.1f - } - }, - followCharacter, - { - lookup: { - tree: "Behaviors:follow" - } - } - ] - } - } - }, - { - sequence: [ - check_nighttime, - { - lookup: { - tree: "MetalRenegades:returnHome" - } - } - ] - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - ] -} diff --git a/assets/behaviors/neutralCitizen.behavior b/assets/behaviors/neutralCitizen.behavior deleted file mode 100644 index 022f0165..00000000 --- a/assets/behaviors/neutralCitizen.behavior +++ /dev/null @@ -1,19 +0,0 @@ -{ - dynamic: [ - { - sequence: [ - check_nighttime, - { - lookup: { - tree: "MetalRenegades:returnHome" - } - } - ] - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - ] -} diff --git a/assets/behaviors/nocturnalCitizen.behavior b/assets/behaviors/nocturnalCitizen.behavior deleted file mode 100644 index a5099171..00000000 --- a/assets/behaviors/nocturnalCitizen.behavior +++ /dev/null @@ -1,23 +0,0 @@ -{ - dynamic: [ - { - sequence: [ - { - invert: { - child: check_nighttime - } - }, - { - lookup: { - tree: "MetalRenegades:returnHome" - } - } - ] - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - ] -} diff --git a/assets/behaviors/scaredCitizen.behavior b/assets/behaviors/scaredCitizen.behavior deleted file mode 100644 index a9238b93..00000000 --- a/assets/behaviors/scaredCitizen.behavior +++ /dev/null @@ -1,40 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:FindNearbyPlayers", - values: ["N charactersWithinRange nonEmpty"], - child: { - sequence: [ - { - sleep: { - time: 0.1f - } - }, - flee_from_character, - { - lookup: { - tree: "Behaviors:flee" - } - } - ] - } - } - }, - { - sequence: [ - check_nighttime, - { - lookup: { - tree: "MetalRenegades:returnHome" - } - } - ] - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - ] -} diff --git a/assets/materials/characters/angryGooey.mat b/assets/materials/characters/angryGooey.mat deleted file mode 100644 index 4d3156a2..00000000 --- a/assets/materials/characters/angryGooey.mat +++ /dev/null @@ -1,8 +0,0 @@ -{ - "shader" : "engine:genericMeshMaterial", - "params" : { - "diffuse" : "MetalRenegades:angryGooey", - "colorOffset" : [1.0, 1.0, 1.0], - "textured" : true - } -} diff --git a/assets/materials/characters/friendlyGooey.mat b/assets/materials/characters/friendlyGooey.mat deleted file mode 100644 index b02d33f0..00000000 --- a/assets/materials/characters/friendlyGooey.mat +++ /dev/null @@ -1,8 +0,0 @@ -{ - "shader" : "engine:genericMeshMaterial", - "params" : { - "diffuse" : "MetalRenegades:friendlyGooey", - "colorOffset" : [1.0, 1.0, 1.0], - "textured" : true - } -} diff --git a/assets/materials/characters/neutralGooey.mat b/assets/materials/characters/neutralGooey.mat deleted file mode 100644 index b987e823..00000000 --- a/assets/materials/characters/neutralGooey.mat +++ /dev/null @@ -1,8 +0,0 @@ -{ - "shader" : "engine:genericMeshMaterial", - "params" : { - "diffuse" : "MetalRenegades:neutralGooey", - "colorOffset" : [1.0, 1.0, 1.0], - "textured" : true - } -} diff --git a/assets/materials/characters/nocturnalGooey.mat b/assets/materials/characters/nocturnalGooey.mat deleted file mode 100644 index 90afb8f5..00000000 --- a/assets/materials/characters/nocturnalGooey.mat +++ /dev/null @@ -1,8 +0,0 @@ -{ - "shader" : "engine:genericMeshMaterial", - "params" : { - "diffuse" : "MetalRenegades:nocturnalGooey", - "colorOffset" : [1.0, 1.0, 1.0], - "textured" : true - } -} diff --git a/assets/materials/characters/scaredGooey.mat b/assets/materials/characters/scaredGooey.mat deleted file mode 100644 index de5ff2e6..00000000 --- a/assets/materials/characters/scaredGooey.mat +++ /dev/null @@ -1,8 +0,0 @@ -{ - "shader" : "engine:genericMeshMaterial", - "params" : { - "diffuse" : "MetalRenegades:scaredGooey", - "colorOffset" : [1.0, 1.0, 1.0], - "textured" : true - } -} diff --git a/assets/prefabs/buildings/marketPlace.prefab b/assets/prefabs/buildings/marketPlace.prefab index 1b8d78b7..323ff28a 100644 --- a/assets/prefabs/buildings/marketPlace.prefab +++ b/assets/prefabs/buildings/marketPlace.prefab @@ -9,13 +9,12 @@ }, "MarketSubscriber" : { "production" : { - "waffles" : 10, - "Blueberry": 1, - "Raspberry": 1, - "Strawberry": 1, - "emptyCup" : 1 + "AdditionalFruits:Blueberry": 3, + "AdditionalFruits:Raspberry": 3, + "AdditionalFruits:Strawberry": 3, + "MetalRenegades:emptyCup": 2 }, - "productionInterval" : 100 + "productionInterval" : 10000 }, "InfiniteStorage" : { "inventory" : {} diff --git a/assets/prefabs/characters/angryGooey.prefab b/assets/prefabs/characters/angryGooey.prefab deleted file mode 100644 index af74f402..00000000 --- a/assets/prefabs/characters/angryGooey.prefab +++ /dev/null @@ -1,112 +0,0 @@ -{ - "alwaysRelevant": true, - "displayName": { - "name": "gooey" - }, - "persisted": true, - "skeletalmesh": { - "mesh": "MetalRenegades:gooey", - "heightOffset": -2.0, - "material": "MetalRenegades:angryGooey", - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ], - "loop": true, - "scale": [ - 0.25, - 0.25, - 0.25 - ] - }, - "Behavior": { - "tree": "MetalRenegades:angryCitizen" - }, - "Stand": { - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ] - }, - "Walk": { - "animationPool": [ - "gooeyIdleBreathing" - ] - }, - "location": {}, - "Character": {}, - "AliveCharacter": {}, - "CharacterMovement": { - "groundFriction": 16, - "speedMultiplier": 0.3, - "distanceBetweenFootsteps": 0.2, - "distanceBetweenSwimStrokes": 2.5, - "height": 1.0, - "radius": 0.5, - "jumpSpeed": 12 - }, - "Network": {}, - "MinionMove": {}, - "Health": {}, - "BoxShape": { - "extents": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Trigger": { - "detectGroups": [ - "engine:debris", - "engine:sensor" - ] - }, - "FindNearbyPlayers": { - "maxDistance": 50 - } -} - diff --git a/assets/prefabs/characters/friendlyGooey.prefab b/assets/prefabs/characters/friendlyGooey.prefab deleted file mode 100644 index 24621f49..00000000 --- a/assets/prefabs/characters/friendlyGooey.prefab +++ /dev/null @@ -1,112 +0,0 @@ -{ - "alwaysRelevant": true, - "displayName": { - "name": "gooey" - }, - "persisted": true, - "skeletalmesh": { - "mesh": "MetalRenegades:gooey", - "heightOffset": -2.0, - "material": "MetalRenegades:friendlyGooey", - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ], - "loop": true, - "scale": [ - 0.25, - 0.25, - 0.25 - ] - }, - "Behavior": { - "tree": "MetalRenegades:friendlyCitizen" - }, - "Stand": { - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ] - }, - "Walk": { - "animationPool": [ - "gooeyIdleBreathing" - ] - }, - "location": {}, - "Character": {}, - "AliveCharacter": {}, - "CharacterMovement": { - "groundFriction": 16, - "speedMultiplier": 0.3, - "distanceBetweenFootsteps": 0.2, - "distanceBetweenSwimStrokes": 2.5, - "height": 1.0, - "radius": 0.5, - "jumpSpeed": 12 - }, - "Network": {}, - "MinionMove": {}, - "Health": {}, - "BoxShape": { - "extents": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Trigger": { - "detectGroups": [ - "engine:debris", - "engine:sensor" - ] - }, - "FindNearbyPlayers": { - "maxDistance": 50 - } -} - diff --git a/assets/prefabs/characters/neutralGooey.prefab b/assets/prefabs/characters/neutralGooey.prefab deleted file mode 100644 index fc2e8304..00000000 --- a/assets/prefabs/characters/neutralGooey.prefab +++ /dev/null @@ -1,109 +0,0 @@ -{ - "alwaysRelevant": true, - "displayName": { - "name": "gooey" - }, - "persisted": true, - "skeletalmesh": { - "mesh": "MetalRenegades:gooey", - "heightOffset": -2.0, - "material": "MetalRenegades:neutralGooey", - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ], - "loop": true, - "scale": [ - 0.25, - 0.25, - 0.25 - ] - }, - "Behavior": { - "tree": "MetalRenegades:neutralCitizen" - }, - "Stand": { - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ] - }, - "Walk": { - "animationPool": [ - "gooeyIdleBreathing" - ] - }, - "location": {}, - "Character": {}, - "AliveCharacter": {}, - "CharacterMovement": { - "groundFriction": 16, - "speedMultiplier": 0.3, - "distanceBetweenFootsteps": 0.2, - "distanceBetweenSwimStrokes": 2.5, - "height": 1.0, - "radius": 0.5, - "jumpSpeed": 12 - }, - "Network": {}, - "MinionMove": {}, - "Health": {}, - "BoxShape": { - "extents": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Trigger": { - "detectGroups": [ - "engine:debris", - "engine:sensor" - ] - } -} - diff --git a/assets/prefabs/characters/nocturnalGooey.prefab b/assets/prefabs/characters/nocturnalGooey.prefab deleted file mode 100644 index 8267be53..00000000 --- a/assets/prefabs/characters/nocturnalGooey.prefab +++ /dev/null @@ -1,112 +0,0 @@ -{ - "alwaysRelevant": true, - "displayName": { - "name": "gooey" - }, - "persisted": true, - "skeletalmesh": { - "mesh": "MetalRenegades:gooey", - "heightOffset": -2.0, - "material": "MetalRenegades:nocturnalGooey", - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ], - "loop": true, - "scale": [ - 0.25, - 0.25, - 0.25 - ] - }, - "Behavior": { - "tree": "MetalRenegades:nocturnalCitizen" - }, - "Stand": { - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ] - }, - "Walk": { - "animationPool": [ - "gooeyIdleBreathing" - ] - }, - "location": {}, - "Character": {}, - "AliveCharacter": {}, - "CharacterMovement": { - "groundFriction": 16, - "speedMultiplier": 0.3, - "distanceBetweenFootsteps": 0.2, - "distanceBetweenSwimStrokes": 2.5, - "height": 1.0, - "radius": 0.5, - "jumpSpeed": 12 - }, - "Network": {}, - "MinionMove": {}, - "Health": {}, - "BoxShape": { - "extents": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Trigger": { - "detectGroups": [ - "engine:debris", - "engine:sensor" - ] - }, - "FindNearbyPlayers": { - "maxDistance": 50 - } -} - diff --git a/assets/prefabs/characters/scaredGooey.prefab b/assets/prefabs/characters/scaredGooey.prefab deleted file mode 100644 index 5520125d..00000000 --- a/assets/prefabs/characters/scaredGooey.prefab +++ /dev/null @@ -1,112 +0,0 @@ -{ - "alwaysRelevant": true, - "displayName": { - "name": "gooey" - }, - "persisted": true, - "skeletalmesh": { - "mesh": "MetalRenegades:gooey", - "heightOffset": -2.0, - "material": "MetalRenegades:scaredGooey", - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ], - "loop": true, - "scale": [ - 0.25, - 0.25, - 0.25 - ] - }, - "Behavior": { - "tree": "MetalRenegades:scaredCitizen" - }, - "Stand": { - "animationPool": [ - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyIdleBreathing", - "gooeyLookRightLeft", - "gooeyLookRightLeft", - "gooeyLookRightUp" - ] - }, - "Walk": { - "animationPool": [ - "gooeyIdleBreathing" - ] - }, - "location": {}, - "Character": {}, - "AliveCharacter": {}, - "CharacterMovement": { - "groundFriction": 16, - "speedMultiplier": 0.3, - "distanceBetweenFootsteps": 0.2, - "distanceBetweenSwimStrokes": 2.5, - "height": 1.0, - "radius": 0.5, - "jumpSpeed": 12 - }, - "Network": {}, - "MinionMove": {}, - "Health": {}, - "BoxShape": { - "extents": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Trigger": { - "detectGroups": [ - "engine:debris", - "engine:sensor" - ] - }, - "FindNearbyPlayers": { - "maxDistance": 50 - } -} - diff --git a/assets/prefabs/generation/oreDefinitions.prefab b/assets/prefabs/generation/oreDefinitions/coalOreDefinition.prefab similarity index 73% rename from assets/prefabs/generation/oreDefinitions.prefab rename to assets/prefabs/generation/oreDefinitions/coalOreDefinition.prefab index 827cf2b2..45d01606 100644 --- a/assets/prefabs/generation/oreDefinitions.prefab +++ b/assets/prefabs/generation/oreDefinitions/coalOreDefinition.prefab @@ -3,7 +3,10 @@ "PocketDensityOreGen": { "block": "CoreAssets:CoalOre", // What block will be placed - "frequency": 1 + "frequency": 4, // How often this pocket will happen in 10 vertical blocks in the region + "radius": 1, + "thickness": 3, + "density": 0.5 } } diff --git a/assets/prefabs/generation/oreDefinitions/copperOreDefinition.prefab b/assets/prefabs/generation/oreDefinitions/copperOreDefinition.prefab new file mode 100644 index 00000000..24ab41ac --- /dev/null +++ b/assets/prefabs/generation/oreDefinitions/copperOreDefinition.prefab @@ -0,0 +1,12 @@ +{ + "OreGenDefinition": {}, + "PocketDensityOreGen": { + "block": "CoreAssets:CopperOre", + // What block will be placed + "frequency": 4, + // How often this pocket will happen in 10 vertical blocks in the region + "radius": 1, + "thickness": 3, + "density": 0.5 + } +} diff --git a/assets/prefabs/generation/oreDefinitions/diamondOreDefinition.prefab b/assets/prefabs/generation/oreDefinitions/diamondOreDefinition.prefab new file mode 100644 index 00000000..2bb03c82 --- /dev/null +++ b/assets/prefabs/generation/oreDefinitions/diamondOreDefinition.prefab @@ -0,0 +1,12 @@ +{ + "OreGenDefinition": {}, + "PocketDensityOreGen": { + "block": "CoreAssets:DiamondOre", + // What block will be placed + "frequency": 2, + // How often this pocket will happen in 10 vertical blocks in the region + "radius": 1, + "thickness": 3, + "density": 0.5 + } +} diff --git a/assets/prefabs/generation/oreDefinitions/goldOreDefinition.prefab b/assets/prefabs/generation/oreDefinitions/goldOreDefinition.prefab new file mode 100644 index 00000000..d847952a --- /dev/null +++ b/assets/prefabs/generation/oreDefinitions/goldOreDefinition.prefab @@ -0,0 +1,12 @@ +{ + "OreGenDefinition": {}, + "PocketDensityOreGen": { + "block": "CoreAssets:GoldOre", + // What block will be placed + "frequency": 2, + // How often this pocket will happen in 10 vertical blocks in the region + "radius": 1, + "thickness": 3, + "density": 0.5 + } +} diff --git a/assets/prefabs/generation/oreDefinitions/ironOreDefinition.prefab b/assets/prefabs/generation/oreDefinitions/ironOreDefinition.prefab new file mode 100644 index 00000000..1257eb15 --- /dev/null +++ b/assets/prefabs/generation/oreDefinitions/ironOreDefinition.prefab @@ -0,0 +1,12 @@ +{ + "OreGenDefinition": {}, + "PocketDensityOreGen": { + "block": "CoreAssets:IronOre", + // What block will be placed + "frequency": 4, + // How often this pocket will happen in 10 vertical blocks in the region + "radius": 1, + "thickness": 3, + "density": 0.5 + } +} diff --git a/assets/prefabs/quests/card.prefab b/assets/prefabs/quests/card.prefab index d565043d..da7a8724 100644 --- a/assets/prefabs/quests/card.prefab +++ b/assets/prefabs/quests/card.prefab @@ -13,19 +13,15 @@ "tasks" : [ { "id" : "collectMeat", - "class" : "CollectBlocksTask", - "data" : { - "itemId" : "WildAnimals:Meat", - "targetAmount" : 2 - } + "class" : "Tasks:CollectBlocksTask", + "itemId" : "WildAnimals:Meat", + "targetAmount" : 2 }, { "id" : "returnHome", - "class" : "GoToBeaconTask", - "dependsOn" : "collectMeat", - "data" : { - "targetBeaconId" : "homeBeacon" - } + "class" : "Tasks:GoToBeaconTask", + "dependsOn" : ["collectMeat"], + "targetBeaconId" : "homeBeacon" } ] } diff --git a/assets/textures/characters/angryGooey.png b/assets/textures/characters/angryGooey.png deleted file mode 100644 index 277b52f7..00000000 Binary files a/assets/textures/characters/angryGooey.png and /dev/null differ diff --git a/assets/textures/characters/friendlyGooey.png b/assets/textures/characters/friendlyGooey.png deleted file mode 100644 index 00220014..00000000 Binary files a/assets/textures/characters/friendlyGooey.png and /dev/null differ diff --git a/assets/textures/characters/neutralGooey.png b/assets/textures/characters/neutralGooey.png deleted file mode 100644 index c4c74f27..00000000 Binary files a/assets/textures/characters/neutralGooey.png and /dev/null differ diff --git a/assets/textures/characters/nocturnalGooey.png b/assets/textures/characters/nocturnalGooey.png deleted file mode 100644 index d4440e4f..00000000 Binary files a/assets/textures/characters/nocturnalGooey.png and /dev/null differ diff --git a/assets/textures/characters/scaredGooey.png b/assets/textures/characters/scaredGooey.png deleted file mode 100644 index ccae5146..00000000 Binary files a/assets/textures/characters/scaredGooey.png and /dev/null differ diff --git a/deltas/engine/prefabs/player.prefab b/deltas/engine/prefabs/player.prefab index bdaab22e..29eab88f 100644 --- a/deltas/engine/prefabs/player.prefab +++ b/deltas/engine/prefabs/player.prefab @@ -5,14 +5,8 @@ }, "StartingInventory": { "items": [ - { "uri": "MetalRenegades:pistol", "quantity": 1 }, - { "uri": "MetalRenegades:bulletItem", "quantity": 32 }, { "uri": "CoreAssets:pickaxe", "quantity": 1 }, - { "uri": "CoreAssets:shovel", "quantity": 1 }, - { "uri": "CoreAssets:axe", "quantity": 1 }, - { "uri": "CoreAdvancedAssets:dynamite", "quantity": 1 }, - { "uri": "CoreAdvancedAssets:gun", "quantity": 1 }, - { "uri": "CoreAssets:Torch", "quantity": 99 } + { "uri": "CoreAssets:Torch", "quantity": 10 } ] }, "Thirst": { diff --git a/module.txt b/module.txt index 011e86c8..e033c7bf 100644 --- a/module.txt +++ b/module.txt @@ -8,7 +8,7 @@ { "id": "AdditionalFruits", "minVersion": "1.0.0"}, { "id": "AdditionalVegetables", "minVersion": "1.0.0"}, { "id": "AdvancedRails", "minVersion": "1.0.0" }, - { "id": "Behaviors", "minVersion": "1.0.0" }, + { "id": "Behaviors", "minVersion": "1.1.0" }, { "id": "Cities", "minVersion": "1.1.0" }, { "id": "CombatSystem", "minVersion": "1.0.0" }, { "id": "CommonWorld", "minVersion": "1.0.0" }, diff --git a/src/main/java/org/terasology/metalrenegades/PlayerInventorySystem.java b/src/main/java/org/terasology/metalrenegades/PlayerInventorySystem.java index 312b04dc..e05905d4 100644 --- a/src/main/java/org/terasology/metalrenegades/PlayerInventorySystem.java +++ b/src/main/java/org/terasology/metalrenegades/PlayerInventorySystem.java @@ -22,14 +22,19 @@ import org.terasology.entitySystem.systems.BaseComponentSystem; import org.terasology.entitySystem.systems.RegisterSystem; import org.terasology.logic.characters.events.PlayerDeathEvent; +import org.terasology.logic.console.commandSystem.annotations.Command; +import org.terasology.logic.console.commandSystem.annotations.Sender; import org.terasology.logic.inventory.InventoryManager; +import org.terasology.logic.inventory.ItemCommands; import org.terasology.logic.inventory.events.DropItemRequest; import org.terasology.logic.location.LocationComponent; +import org.terasology.logic.permission.PermissionManager; import org.terasology.logic.players.LocalPlayer; import org.terasology.math.geom.Vector3f; import org.terasology.registry.In; import org.terasology.world.block.BlockManager; +import java.util.HashMap; import java.util.Random; /** @@ -37,6 +42,10 @@ */ @RegisterSystem public class PlayerInventorySystem extends BaseComponentSystem { + + @In + private ItemCommands itemCommands; + @In private BlockManager blockManager; @@ -58,6 +67,20 @@ public class PlayerInventorySystem extends BaseComponentSystem { private final Vector3f OFFSET = new Vector3f(1, 1, 1); private final float BOUND = 2f; + private HashMap testingItems = new HashMap<>(); + + @Override + public void postBegin() { + testingItems.put("MetalRenegades:pistol", 1); + testingItems.put("MetalRenegades:bulletItem", 32); + testingItems.put("CoreAssets:pickaxe", 1); + testingItems.put("CoreAssets:shovel", 1); + testingItems.put("CoreAssets:axe", 1); + testingItems.put("CoreAdvancedAssets:dynamite", 1); + testingItems.put("CoreAdvancedAssets:gun", 1); + testingItems.put("CoreAssets:Torch", 64); + } + @ReceiveEvent public void onPlayerDeath(PlayerDeathEvent event, EntityRef character) { if (character.equals(localPlayer.getCharacterEntity())) { @@ -87,4 +110,10 @@ public void onPlayerDeath(PlayerDeathEvent event, EntityRef character) { } } } + + @Command(shortDescription = "Gives basic testing items for Metal Renegades", requiredPermission = PermissionManager.CHEAT_PERMISSION) + public String testingKitMR(@Sender EntityRef sender) { + testingItems.entrySet().stream().forEach(e -> itemCommands.give(sender, e.getKey(), e.getValue(), null)); + return "Testing item kit has been given."; + } } diff --git a/src/main/java/org/terasology/metalrenegades/ai/actions/CheckNeedAction.java b/src/main/java/org/terasology/metalrenegades/ai/actions/CheckNeedAction.java index 78764073..64218ddf 100644 --- a/src/main/java/org/terasology/metalrenegades/ai/actions/CheckNeedAction.java +++ b/src/main/java/org/terasology/metalrenegades/ai/actions/CheckNeedAction.java @@ -39,7 +39,24 @@ public BehaviorState modify(Actor actor, BehaviorState result) { CitizenNeed.Type needTypeValue = CitizenNeed.Type.valueOf(needType); NeedsComponent needsComponent = actor.getComponent(NeedsComponent.class); - CitizenNeed currentNeed = needsComponent.needs.get(needTypeValue); + CitizenNeed currentNeed; + + switch (needTypeValue) { + case FOOD: + currentNeed = needsComponent.hungerNeed; + break; + case WATER: + currentNeed = needsComponent.thirstNeed; + break; + case SOCIAL: + currentNeed = needsComponent.socialNeed; + break; + case REST: + currentNeed = needsComponent.restNeed; + break; + default: + return BehaviorState.FAILURE; + } return currentNeed.isBelowGoal() ? BehaviorState.SUCCESS : BehaviorState.FAILURE; } diff --git a/src/main/java/org/terasology/metalrenegades/ai/actions/CheckNightAction.java b/src/main/java/org/terasology/metalrenegades/ai/actions/CheckNightAction.java deleted file mode 100644 index 38f4c568..00000000 --- a/src/main/java/org/terasology/metalrenegades/ai/actions/CheckNightAction.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2018 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.terasology.metalrenegades.ai.actions; - -import org.terasology.logic.behavior.BehaviorAction; -import org.terasology.logic.behavior.core.Actor; -import org.terasology.logic.behavior.core.BaseAction; -import org.terasology.logic.behavior.core.BehaviorState; -import org.terasology.metalrenegades.ai.system.NightTrackerSystem; -import org.terasology.registry.CoreRegistry; -import org.terasology.registry.In; - -/** - * Behavior node that checks the current night status, succeeds at nighttime and fails at daytime. - */ -@BehaviorAction(name = "check_nighttime") -public class CheckNightAction extends BaseAction { - - @In - private NightTrackerSystem nightTrackerSystem; - - @Override - public void construct(Actor actor) { - // TODO: Temporary fix for injection malfunction in actions, ideally remove this in the future. - nightTrackerSystem = CoreRegistry.get(NightTrackerSystem.class); - } - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - if (nightTrackerSystem.isNight()) { - return BehaviorState.SUCCESS; - } - return BehaviorState.FAILURE; - } - -} diff --git a/src/main/java/org/terasology/metalrenegades/ai/actions/FulfillNeedAction.java b/src/main/java/org/terasology/metalrenegades/ai/actions/FulfillNeedAction.java index 7dcaad25..2670ca7f 100644 --- a/src/main/java/org/terasology/metalrenegades/ai/actions/FulfillNeedAction.java +++ b/src/main/java/org/terasology/metalrenegades/ai/actions/FulfillNeedAction.java @@ -36,7 +36,23 @@ public BehaviorState modify(Actor actor, BehaviorState result) { CitizenNeed.Type needTypeValue = CitizenNeed.Type.valueOf(needType); NeedsComponent needsComponent = actor.getComponent(NeedsComponent.class); - needsComponent.needs.get(needTypeValue).restoreNeed(); + + switch (needTypeValue) { + case FOOD: + needsComponent.hungerNeed.restoreNeed(); + break; + case WATER: + needsComponent.thirstNeed.restoreNeed(); + break; + case SOCIAL: + needsComponent.socialNeed.restoreNeed(); + break; + case REST: + needsComponent.restNeed.restoreNeed(); + break; + default: + return BehaviorState.FAILURE; + } actor.save(needsComponent); actor.getEntity().removeComponent(FollowComponent.class); diff --git a/src/main/java/org/terasology/metalrenegades/ai/component/NeedsComponent.java b/src/main/java/org/terasology/metalrenegades/ai/component/NeedsComponent.java index ca279b89..d2924ac0 100644 --- a/src/main/java/org/terasology/metalrenegades/ai/component/NeedsComponent.java +++ b/src/main/java/org/terasology/metalrenegades/ai/component/NeedsComponent.java @@ -17,6 +17,7 @@ import org.terasology.entitySystem.Component; import org.terasology.metalrenegades.ai.CitizenNeed; +import org.terasology.network.Replicate; import java.util.EnumMap; import java.util.Map; @@ -26,6 +27,27 @@ */ public class NeedsComponent implements Component { - public Map needs = new EnumMap<>(CitizenNeed.Type.class); + @Replicate + public CitizenNeed hungerNeed; + + @Replicate + public CitizenNeed thirstNeed; + + @Replicate + public CitizenNeed socialNeed; + + @Replicate + public CitizenNeed restNeed; + + public NeedsComponent(CitizenNeed hunger, CitizenNeed thirst, CitizenNeed social, CitizenNeed rest) { + this.hungerNeed = hunger; + this.thirstNeed = thirst; + this.socialNeed = social; + this.restNeed = rest; + } + + public NeedsComponent() { + + } } diff --git a/src/main/java/org/terasology/metalrenegades/ai/system/CitizenSpawnSystem.java b/src/main/java/org/terasology/metalrenegades/ai/system/CitizenSpawnSystem.java index f175b3bf..f4d3a43b 100644 --- a/src/main/java/org/terasology/metalrenegades/ai/system/CitizenSpawnSystem.java +++ b/src/main/java/org/terasology/metalrenegades/ai/system/CitizenSpawnSystem.java @@ -122,12 +122,11 @@ private EntityRef spawnCitizen(EntityRef homeEntity) { entityBuilder.addComponent(homeComponent); entityBuilder.saveComponent(citizenLocationComponent); - NeedsComponent needsComponent = new NeedsComponent(); - - needsComponent.needs.put(CitizenNeed.Type.FOOD, new CitizenNeed(20, 0.5f, 5, 15)); - needsComponent.needs.put(CitizenNeed.Type.WATER, new CitizenNeed(20, 1, 8, 20)); - needsComponent.needs.put(CitizenNeed.Type.SOCIAL, new CitizenNeed(30, 1, 15, 30)); - needsComponent.needs.put(CitizenNeed.Type.REST, new CitizenNeed(50, 0.5f, 20, 50)); + NeedsComponent needsComponent = new NeedsComponent( + new CitizenNeed(20, 0.5f, 5, 15), // hunger + new CitizenNeed(20, 1, 8, 20), // thirst + new CitizenNeed(30, 1, 15, 30), // social + new CitizenNeed(50, 0.5f, 20, 50)); // rest entityBuilder.saveComponent(needsComponent); entityBuilder.addComponent(new TraderComponent()); diff --git a/src/main/java/org/terasology/metalrenegades/ai/system/CitizenTooltipSystem.java b/src/main/java/org/terasology/metalrenegades/ai/system/CitizenTooltipSystem.java index 03a7a5d3..112c62b3 100644 --- a/src/main/java/org/terasology/metalrenegades/ai/system/CitizenTooltipSystem.java +++ b/src/main/java/org/terasology/metalrenegades/ai/system/CitizenTooltipSystem.java @@ -47,7 +47,10 @@ public void getTooltipName(GetTooltipNameEvent event, EntityRef entity, CitizenC @ReceiveEvent(components = NeedsComponent.class) public void addNeedsToTooltip(GetItemTooltip event, EntityRef entity, NeedsComponent needsComponent) { - needsComponent.needs.forEach((k, v) -> event.getTooltipLines().add(new TooltipLine(k.toString() + " " + v.toString()))); + event.getTooltipLines().add(new TooltipLine("Hunger: " + needsComponent.hungerNeed.toString())); + event.getTooltipLines().add(new TooltipLine("Thirst: " + needsComponent.thirstNeed.toString())); + event.getTooltipLines().add(new TooltipLine("Social: " + needsComponent.socialNeed.toString())); + event.getTooltipLines().add(new TooltipLine("Rest: " + needsComponent.restNeed.toString())); } @ReceiveEvent(components = CitizenComponent.class) diff --git a/src/main/java/org/terasology/metalrenegades/ai/system/NeedsSystem.java b/src/main/java/org/terasology/metalrenegades/ai/system/NeedsSystem.java index 912c0091..d54ce15c 100644 --- a/src/main/java/org/terasology/metalrenegades/ai/system/NeedsSystem.java +++ b/src/main/java/org/terasology/metalrenegades/ai/system/NeedsSystem.java @@ -41,7 +41,10 @@ public void onWorldTimeEvent(WorldTimeEvent worldTimeEvent, EntityRef entityRef) for (EntityRef entity : entityManager.getEntitiesWith(NeedsComponent.class)) { NeedsComponent needsComponent = entity.getComponent(NeedsComponent.class); - needsComponent.needs.forEach((k, v) -> v.runNeedCycle()); + needsComponent.hungerNeed.runNeedCycle(); + needsComponent.thirstNeed.runNeedCycle(); + needsComponent.socialNeed.runNeedCycle(); + needsComponent.restNeed.runNeedCycle(); entity.saveComponent(needsComponent); } diff --git a/src/main/java/org/terasology/metalrenegades/ai/system/NightTrackerSystem.java b/src/main/java/org/terasology/metalrenegades/ai/system/NightTrackerSystem.java deleted file mode 100644 index 15954ed9..00000000 --- a/src/main/java/org/terasology/metalrenegades/ai/system/NightTrackerSystem.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2018 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.terasology.metalrenegades.ai.system; - -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.entitySystem.event.ReceiveEvent; -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterMode; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.registry.Share; -import org.terasology.world.sun.OnDawnEvent; -import org.terasology.world.sun.OnDuskEvent; - -/** - * Tracks the current night status for time-based behavior trees. - */ -@RegisterSystem(RegisterMode.AUTHORITY) -@Share(value = NightTrackerSystem.class) -public class NightTrackerSystem extends BaseComponentSystem { - - // TODO: The assumption is made that this system is started with daylight, replace with a proper check on start. - private boolean isSunUp = true; - - @ReceiveEvent - public void onDawnEvent(OnDawnEvent event, EntityRef entityRef) { - isSunUp = true; - } - - @ReceiveEvent - public void onDuskEvent(OnDuskEvent event, EntityRef entityRef) { - isSunUp = false; - } - - /** - * Returns current night status, true if the sun is down, false otherwise. - * - * @return The current night status of the world. - */ - public boolean isNight() { - return !isSunUp; - } - -} diff --git a/src/main/java/org/terasology/metalrenegades/economy/actions/ShowMarketScreenAction.java b/src/main/java/org/terasology/metalrenegades/economy/actions/ShowMarketScreenAction.java index 0ede3176..56cecbe0 100644 --- a/src/main/java/org/terasology/metalrenegades/economy/actions/ShowMarketScreenAction.java +++ b/src/main/java/org/terasology/metalrenegades/economy/actions/ShowMarketScreenAction.java @@ -45,8 +45,5 @@ public void execute(EntityRef charEntity, EntityRef talkTo) { talkTo.send(new MarketScreenRequestEvent(marketID, charEntity, type)); } - public long getMarketID() { - return marketID; - } } diff --git a/src/main/java/org/terasology/metalrenegades/economy/events/MarketTransactionRequest.java b/src/main/java/org/terasology/metalrenegades/economy/events/MarketTransactionRequest.java new file mode 100644 index 00000000..71089c0b --- /dev/null +++ b/src/main/java/org/terasology/metalrenegades/economy/events/MarketTransactionRequest.java @@ -0,0 +1,32 @@ +package org.terasology.metalrenegades.economy.events; + +import org.terasology.entitySystem.event.Event; +import org.terasology.metalrenegades.economy.ui.MarketItem; +import org.terasology.network.ServerEvent; + +/** + * A client-to-server event which requests the transaction of a particular item. + */ +@ServerEvent +public class MarketTransactionRequest implements Event { + + /** + * The item to be bought/sold. + */ + public MarketItem item; + + /** + * The type of transaction to take place. + */ + public TransactionType type; + + public MarketTransactionRequest(MarketItem item, TransactionType type) { + this.item = item; + this.type = type; + } + + public MarketTransactionRequest() { + + } + +} diff --git a/src/main/java/org/terasology/metalrenegades/economy/events/UpdateMarketScreenEvent.java b/src/main/java/org/terasology/metalrenegades/economy/events/UpdateMarketScreenEvent.java new file mode 100644 index 00000000..6f29c1dc --- /dev/null +++ b/src/main/java/org/terasology/metalrenegades/economy/events/UpdateMarketScreenEvent.java @@ -0,0 +1,9 @@ +package org.terasology.metalrenegades.economy.events; + +import org.terasology.entitySystem.event.Event; + +public class UpdateMarketScreenEvent implements Event { + + public UpdateMarketScreenEvent() { } + +} diff --git a/src/main/java/org/terasology/metalrenegades/economy/systems/MarketCitizenSpawnSystem.java b/src/main/java/org/terasology/metalrenegades/economy/systems/MarketCitizenSpawnSystem.java index 773cfe42..c2f0a0e5 100644 --- a/src/main/java/org/terasology/metalrenegades/economy/systems/MarketCitizenSpawnSystem.java +++ b/src/main/java/org/terasology/metalrenegades/economy/systems/MarketCitizenSpawnSystem.java @@ -32,6 +32,7 @@ import org.terasology.entitySystem.event.ReceiveEvent; import org.terasology.entitySystem.prefab.Prefab; import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; import org.terasology.entitySystem.systems.RegisterSystem; import org.terasology.math.geom.Rect2i; import org.terasology.math.geom.Vector3f; @@ -47,7 +48,7 @@ /** * Spawns a market citizen in all markets */ -@RegisterSystem +@RegisterSystem(RegisterMode.AUTHORITY) public class MarketCitizenSpawnSystem extends BaseComponentSystem { @In @@ -71,7 +72,6 @@ public void onMarketPlaceSpawn(BuildingEntitySpawnedEvent event, EntityRef entit trader.addComponent(settlementRefComponent); MarketComponent marketComponent = settlementRefComponent.settlement.getComponent(MarketComponent.class); - DialogComponent dialogComponent = new DialogComponent(); dialogComponent.pages = new ArrayList<>(); @@ -81,12 +81,12 @@ public void onMarketPlaceSpawn(BuildingEntitySpawnedEvent event, EntityRef entit DialogResponse buyResponse = new DialogResponse(); buyResponse.action = new ArrayList<>(); - buyResponse.action.add(new ShowMarketScreenAction(marketComponent.market.getId(), TransactionType.BUYING)); + buyResponse.action.add(new ShowMarketScreenAction(marketComponent.getMarketId(), TransactionType.BUYING)); buyResponse.text = "Buy"; DialogResponse sellResponse = new DialogResponse(); sellResponse.action = new ArrayList<>(); - sellResponse.action.add(new ShowMarketScreenAction(marketComponent.market.getId(), TransactionType.SELLING)); + sellResponse.action.add(new ShowMarketScreenAction(marketComponent.getMarketId(), TransactionType.SELLING)); sellResponse.text = "Sell"; DialogResponse closeResponse = new DialogResponse(); diff --git a/src/main/java/org/terasology/metalrenegades/economy/systems/MarketManagementSystem.java b/src/main/java/org/terasology/metalrenegades/economy/systems/MarketManagementSystem.java index aac5f884..0e028d9c 100644 --- a/src/main/java/org/terasology/metalrenegades/economy/systems/MarketManagementSystem.java +++ b/src/main/java/org/terasology/metalrenegades/economy/systems/MarketManagementSystem.java @@ -28,34 +28,31 @@ import org.terasology.dynamicCities.settlements.components.ActiveSettlementComponent; import org.terasology.dynamicCities.settlements.components.MarketComponent; import org.terasology.dynamicCities.settlements.events.SettlementRegisterEvent; -import org.terasology.economy.components.InfiniteStorageComponent; -import org.terasology.economy.components.MarketSubscriberComponent; -import org.terasology.economy.components.MultiInvStorageComponent; -import org.terasology.economy.events.ResourceDrawEvent; -import org.terasology.economy.events.ResourceInfoRequestEvent; -import org.terasology.economy.events.ResourceStoreEvent; -import org.terasology.economy.events.SubscriberRegistrationEvent; -import org.terasology.economy.events.UpdateWalletEvent; +import org.terasology.economy.components.*; +import org.terasology.economy.events.*; import org.terasology.economy.handler.MultiInvStorageHandler; import org.terasology.economy.systems.MarketLogisticSystem; -import org.terasology.economy.systems.WalletSystem; +import org.terasology.economy.systems.WalletAuthoritySystem; import org.terasology.entitySystem.entity.EntityManager; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.entitySystem.event.ReceiveEvent; import org.terasology.entitySystem.prefab.Prefab; import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; import org.terasology.entitySystem.systems.RegisterSystem; import org.terasology.entitySystem.systems.UpdateSubscriberSystem; import org.terasology.logic.inventory.InventoryManager; import org.terasology.logic.inventory.ItemComponent; -import org.terasology.logic.players.LocalPlayer; +import org.terasology.logic.players.event.OnPlayerSpawnedEvent; +import org.terasology.metalrenegades.economy.events.MarketTransactionRequest; import org.terasology.metalrenegades.economy.events.TransactionType; import org.terasology.metalrenegades.economy.ui.MarketItem; -import org.terasology.network.ClientComponent; +import org.terasology.network.NetworkComponent; import org.terasology.registry.In; import org.terasology.registry.Share; import org.terasology.world.block.BlockManager; import org.terasology.world.block.entity.BlockCommands; +import org.terasology.world.block.items.BlockItemComponent; import java.util.Set; @@ -63,7 +60,7 @@ * Handles most core market features */ @Share(MarketManagementSystem.class) -@RegisterSystem +@RegisterSystem(RegisterMode.AUTHORITY) public class MarketManagementSystem extends BaseComponentSystem implements UpdateSubscriberSystem { @In @@ -81,9 +78,6 @@ public class MarketManagementSystem extends BaseComponentSystem implements Updat @In private InventoryManager inventoryManager; - @In - private LocalPlayer localPlayer; - @In private BlockCommands blockCommands; @@ -94,19 +88,20 @@ public class MarketManagementSystem extends BaseComponentSystem implements Updat private MultiInvStorageHandler handler; @In - private WalletSystem walletSystem; - - private EntityRef playerResourceStore; + private WalletAuthoritySystem walletAuthoritySystem; private final int COOLDOWN = 200; private int counter = 0; private Logger logger = LoggerFactory.getLogger(MarketManagementSystem.class); - @Override - public void postBegin() { - playerResourceStore = entityManager.create(); + @ReceiveEvent + public void onPlayerJoin(OnPlayerSpawnedEvent onPlayerSpawnedEvent, EntityRef player) { + EntityRef playerResourceStore = entityManager.create(); playerResourceStore.addComponent(new InfiniteStorageComponent(1)); + playerResourceStore.setOwner(player); + + player.addComponent(new PlayerResourceStoreComponent(playerResourceStore)); } @Override @@ -139,7 +134,9 @@ public void update(float delta) { @ReceiveEvent(components = {ActiveSettlementComponent.class, PopulationComponent.class, CultureComponent.class}) public void onSettlementSpawnEvent(SettlementRegisterEvent event, EntityRef settlement) { EntityRef market = entityManager.create(new InfiniteStorageComponent(1)); + settlement.addComponent(new NetworkComponent()); MarketComponent marketComponent = new MarketComponent(market); + marketComponent.marketId = market.getId(); settlement.addComponent(marketComponent); } @@ -156,83 +153,54 @@ public void onBuildingEntitySpawned(BuildingEntitySpawnedEvent event, EntityRef entityRef.send(new SubscriberRegistrationEvent()); } - // TODO: Expose transaction logic as events -// @ReceiveEvent -// public void onMarketTransactionConfirm(MarketTransactionEvent event, EntityRef character) { -// -// } - /** * Initiate a transaction and delegate to an appropriate method depending * on the nature of the transaction - * @param item MarketItem to be bought/sold - * @param type TransactionType - * @return updated MarketItem */ - public MarketItem handleTransaction(MarketItem item, TransactionType type) { - if (type == TransactionType.BUYING) { - return buy(item); - } else if (type == TransactionType.SELLING) { - return sell(item); + @ReceiveEvent + public void onMarketTransactionRequest(MarketTransactionRequest request, EntityRef character) { + if (request.type == TransactionType.BUYING) { + buy(character, request.item); + } else if (request.type == TransactionType.SELLING) { + sell(character, request.item); } else { logger.warn("TransactionType invalid"); - return item; } } - private MarketItem buy(MarketItem item) { - if (!walletSystem.isValidTransaction(-1 * item.cost)) { + private MarketItem buy(EntityRef character, MarketItem item) { + if (!walletAuthoritySystem.isValidTransaction(character,-1 * item.cost)) { logger.warn("Insufficient funds"); return item; } else if (item.quantity > 0) { - if (!createItemOrBlock(item.name)) { + if (!createItemOrBlock(character, item.name)) { logger.warn("Failed to create entity"); return item; } - Iterable storageBuildings = entityManager.getEntitiesWith(MultiInvStorageComponent.class, SettlementRefComponent.class); - for (EntityRef bldg : storageBuildings) { - if (!bldg.isActive() || !bldg.exists()) { - continue; - } - - MultiInvStorageComponent component = bldg.getComponent(MultiInvStorageComponent.class); - - playerResourceStore.send(new ResourceDrawEvent(item.name, 1, bldg)); - - logger.info("\n\n playerStore: {} \n bldg: {} \n\n", - playerResourceStore.getComponent(InfiniteStorageComponent.class).inventory.get(item.name), - handler.availableResourceAmount(component, item.name)); - - item.quantity--; - localPlayer.getCharacterEntity().send(new UpdateWalletEvent(-1 * item.cost)); - break; - } + SettlementRefComponent playerSettlementRef = character.getComponent(SettlementRefComponent.class); + EntityRef playerResourceStore = character.getComponent(PlayerResourceStoreComponent.class).resourceStore; + playerResourceStore.send(new ResourceDrawEvent(item.name, 1, playerSettlementRef.settlement.getComponent(MarketComponent.class).market)); + character.send(new WalletTransactionEvent(-1 * item.cost)); + item.quantity--; } return item; } - private MarketItem sell(MarketItem item) { - if (item.quantity <=0 || !destroyItemOrBlock(item.name)) { - logger.warn("Failed to create entity"); + private MarketItem sell(EntityRef character, MarketItem item) { + if (item.quantity <=0 || !destroyItemOrBlock(character, item.name)) { + logger.warn("Failed to destroy entity"); return item; } + EntityRef playerResourceStore = character.getComponent(PlayerResourceStoreComponent.class).resourceStore; + SettlementRefComponent settlementRefComponent = character.getComponent(SettlementRefComponent.class); + playerResourceStore.send(new ResourceStoreEvent(item.name, 1, settlementRefComponent.settlement.getComponent(MarketComponent.class).market)); - Iterable storageBuildings = entityManager.getEntitiesWith(MultiInvStorageComponent.class, SettlementRefComponent.class); - for (EntityRef bldg : storageBuildings) { - if (!bldg.isActive() || !bldg.exists()) { - continue; - } - - SettlementRefComponent settlementRefComponent = bldg.getComponent(SettlementRefComponent.class); - playerResourceStore.send(new ResourceStoreEvent(item.name, 1, settlementRefComponent.settlement.getComponent(MarketComponent.class).market)); - item.quantity--; - localPlayer.getCharacterEntity().send(new UpdateWalletEvent(item.cost)); - break; - } + character.send(new WalletTransactionEvent(item.cost)); + item.quantity--; return item; } @@ -243,22 +211,28 @@ private MarketItem sell(MarketItem item) { * @param name Name of the item bought * @return Boolean indication whether the creating was a success or a failure */ - private boolean createItemOrBlock(String name) { + private boolean createItemOrBlock(EntityRef character, String name) { Set matches = assetManager.resolve(name, Prefab.class); + SettlementRefComponent playerSettlementRef = character.getComponent(SettlementRefComponent.class); + ResourceInfoRequestEvent request = playerSettlementRef.settlement.getComponent(MarketComponent.class).market.send(new ResourceInfoRequestEvent()); + + if (!request.isHandled || request.resources.get(name) <= 0) { + return false; + } if (matches.size() == 1) { Prefab prefab = assetManager.getAsset(matches.iterator().next(), Prefab.class).orElse(null); if (prefab != null && prefab.getComponent(ItemComponent.class) != null) { - EntityRef playerEntity = localPlayer.getClientEntity().getComponent(ClientComponent.class).character; EntityRef entity = entityManager.create(prefab); - if (!inventoryManager.giveItem(playerEntity, playerEntity, entity)) { + if (!inventoryManager.giveItem(character, character, entity)) { entity.destroy(); return true; } } } - String message = blockCommands.giveBlock(localPlayer.getClientEntity(), name, 1, null); + String blockURI = matches.iterator().next().getModuleName() + ":" + matches.iterator().next().getResourceName(); + String message = blockCommands.giveBlock(character.getOwner(), blockURI, 1, null); if (message != null) { return true; } @@ -271,18 +245,32 @@ private boolean createItemOrBlock(String name) { * @param name Name of the item sold * @return Boolean indication whether the removal was a success or a failure */ - private boolean destroyItemOrBlock(String name) { - EntityRef player = localPlayer.getCharacterEntity(); + private boolean destroyItemOrBlock(EntityRef character, String name) { EntityRef item = EntityRef.NULL; try { - for (int i = 0; i < inventoryManager.getNumSlots(player); i++) { - EntityRef current = inventoryManager.getItemInSlot(player, i); - if (!EntityRef.NULL.equals(current) && name.equalsIgnoreCase(current.getParentPrefab().getName())) { + for (int i = 0; i < inventoryManager.getNumSlots(character); i++) { + EntityRef current = inventoryManager.getItemInSlot(character, i); + + if (EntityRef.NULL.equals(current)) { + continue; + } + + if (name.equalsIgnoreCase(current.getParentPrefab().getName())) { item = current; break; } + + if (current.getParentPrefab().getName().equalsIgnoreCase("engine:blockItemBase")) { + if (current.getComponent(BlockItemComponent.class).blockFamily.getURI().toString().equalsIgnoreCase(name)) { + item = current; + break; + } + } + } + if (item == EntityRef.NULL) { + return false; } - inventoryManager.removeItem(localPlayer.getCharacterEntity(), EntityRef.NULL, item, true, 1); + inventoryManager.removeItem(character, EntityRef.NULL, item, true, 1); } catch (Exception e) { logger.error("Could not create entity from {}. Exception: {}", name, e.getMessage()); return false; diff --git a/src/main/java/org/terasology/metalrenegades/economy/ui/MarketScreen.java b/src/main/java/org/terasology/metalrenegades/economy/ui/MarketScreen.java index 5b2efeab..4deb5f35 100644 --- a/src/main/java/org/terasology/metalrenegades/economy/ui/MarketScreen.java +++ b/src/main/java/org/terasology/metalrenegades/economy/ui/MarketScreen.java @@ -18,7 +18,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.logic.players.LocalPlayer; +import org.terasology.metalrenegades.economy.events.MarketTransactionRequest; import org.terasology.metalrenegades.economy.events.TransactionType; +import org.terasology.metalrenegades.economy.events.UpdateMarketScreenEvent; import org.terasology.metalrenegades.economy.systems.MarketManagementSystem; import org.terasology.registry.In; import org.terasology.rendering.nui.CoreScreenLayer; @@ -129,10 +131,12 @@ public List get() { confirm = find("confirm", UIButton.class); confirm.subscribe((widget -> { if (type == TransactionType.BUYING || type == TransactionType.SELLING) { - // TODO: Expose transaction logic as events -// player.getCharacterEntity().send(new MarketTransactionEvent(selected, type)); - selected = marketManagementSystem.handleTransaction(selected, type); + MarketTransactionRequest marketTransactionRequest = new MarketTransactionRequest(); + marketTransactionRequest.item = selected; + marketTransactionRequest.type = type; + player.getCharacterEntity().send(marketTransactionRequest); logger.info("Confirmed transaction of one {}", selected.name); + player.getCharacterEntity().send(new UpdateMarketScreenEvent()); } else { logger.warn("TransactionType not recognised. No transaction."); } diff --git a/src/main/java/org/terasology/metalrenegades/economy/ui/MarketUISystem.java b/src/main/java/org/terasology/metalrenegades/economy/ui/MarketUISystem.java index 9227eed9..0f1921ca 100644 --- a/src/main/java/org/terasology/metalrenegades/economy/ui/MarketUISystem.java +++ b/src/main/java/org/terasology/metalrenegades/economy/ui/MarketUISystem.java @@ -18,7 +18,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.assets.ResourceUrn; -import org.terasology.economy.events.ResourceInfoRequestEvent; +import org.terasology.economy.events.MarketInfoClientRequestEvent; +import org.terasology.economy.events.MarketInfoClientResponseEvent; import org.terasology.entitySystem.entity.EntityManager; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.entitySystem.event.ReceiveEvent; @@ -30,12 +31,14 @@ import org.terasology.logic.players.LocalPlayer; import org.terasology.metalrenegades.economy.events.MarketScreenRequestEvent; import org.terasology.metalrenegades.economy.events.TransactionType; +import org.terasology.metalrenegades.economy.events.UpdateMarketScreenEvent; import org.terasology.registry.In; import org.terasology.registry.Share; import org.terasology.rendering.nui.NUIManager; +import org.terasology.world.block.items.BlockItemComponent; +import org.terasology.world.time.WorldTimeEvent; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -62,11 +65,22 @@ public class MarketUISystem extends BaseComponentSystem { private MarketScreen marketScreen; + private long marketID; + + private TransactionType type; + @Override public void initialise() { marketScreen = (MarketScreen) nuiManager.createScreen("MetalRenegades:marketScreen"); } + @ReceiveEvent + public void onWorldTimeCycle(WorldTimeEvent worldTimeEvent, EntityRef entity) { + if (marketID != 0 && type != null) { + updateScreenInformation(); + } + } + @ReceiveEvent public void onToggleInventory(MarketScreenRequestEvent event, EntityRef entity) { ResourceUrn activeInteractionScreenUri = InteractionUtil.getActiveInteractionScreenUri(entity); @@ -80,40 +94,62 @@ public void onToggleInventory(MarketScreenRequestEvent event, EntityRef entity) @ReceiveEvent public void onMarketScreenAction(MarketScreenRequestEvent event, EntityRef entityRef) { List marketItemList = new ArrayList<>(); + marketScreen.setItemList(marketItemList); // clear out any old item listings from the UI. - if (event.type == TransactionType.BUYING) { - EntityRef market = entityManager.getEntity(event.market); - ResourceInfoRequestEvent resourceInfoRequestEvent = new ResourceInfoRequestEvent(); - Map resources; - market.send(resourceInfoRequestEvent); - - if (resourceInfoRequestEvent.isHandled) { - resources = resourceInfoRequestEvent.resources; - } else { - logger.error("Could not retrieve resource information."); - return; - } + this.marketID = event.market; + this.type = event.type; - for (Map.Entry entry : resources.entrySet()) { - MarketItem item = MarketItemBuilder.get(entry.getKey(), entry.getValue()); - marketItemList.add(item); - } - } else if (event.type == TransactionType.SELLING){ + updateScreenInformation(); + + marketScreen.setType(event.type); + } + + @ReceiveEvent + public void onResourceInfoResponse(MarketInfoClientResponseEvent marketInfoResponseEvent, EntityRef character) { + List marketItemList = new ArrayList<>(); + Map resources; + + resources = marketInfoResponseEvent.resources; + + for (Map.Entry entry : resources.entrySet()) { + MarketItem item = MarketItemBuilder.get(entry.getKey(), entry.getValue()); + marketItemList.add(item); + } + + marketScreen.setItemList(marketItemList); + } + + @ReceiveEvent + public void onUpdateScreenEvent(UpdateMarketScreenEvent event, EntityRef entity) { + updateScreenInformation(); + } + + private void updateScreenInformation() { + List marketItemList = new ArrayList<>(); + + if (type == TransactionType.BUYING) { + localPlayer.getCharacterEntity().send(new MarketInfoClientRequestEvent(marketID)); + } else if (type == TransactionType.SELLING){ EntityRef player = localPlayer.getCharacterEntity(); int slots = inventoryManager.getNumSlots(player); for (int i = 0; i < slots; i++) { EntityRef entity = inventoryManager.getItemInSlot(player, i); if (entity.getParentPrefab() != null) { - MarketItem item = MarketItemBuilder.get(entity.getParentPrefab().getName(), 1); // TODO: 1? + MarketItem item; + logger.info(entity.getParentPrefab().getName() + " == " + "blockItemBase"); + if (entity.getParentPrefab().getName().equalsIgnoreCase("engine:blockItemBase")) { + item = MarketItemBuilder.get(entity.getComponent(BlockItemComponent.class).blockFamily.getURI().toString(), inventoryManager.getStackSize(entity)); + } else { + item = MarketItemBuilder.get(entity.getParentPrefab().getName(), inventoryManager.getStackSize(entity)); + } marketItemList.add(item); } } + marketScreen.setItemList(marketItemList); } else { logger.warn("TransactionType not recognised."); } - - marketScreen.setType(event.type); - marketScreen.setItemList(marketItemList); } + } diff --git a/src/main/java/org/terasology/metalrenegades/quests/FetchQuestSystem.java b/src/main/java/org/terasology/metalrenegades/quests/FetchQuestSystem.java index d86885a5..7f2bdb89 100644 --- a/src/main/java/org/terasology/metalrenegades/quests/FetchQuestSystem.java +++ b/src/main/java/org/terasology/metalrenegades/quests/FetchQuestSystem.java @@ -20,7 +20,7 @@ import org.terasology.dynamicCities.buildings.components.SettlementRefComponent; import org.terasology.dynamicCities.construction.events.BuildingEntitySpawnedEvent; import org.terasology.dynamicCities.parcels.DynParcel; -import org.terasology.economy.events.UpdateWalletEvent; +import org.terasology.economy.events.WalletTransactionEvent; import org.terasology.entitySystem.entity.EntityManager; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.entitySystem.event.ReceiveEvent; @@ -173,7 +173,7 @@ public void onQuestComplete(QuestCompleteEvent event, EntityRef client) { inventoryManager.removeItem(character, EntityRef.NULL, item, true, amounts.getOrDefault(ITEM_ID, 0)); // Pay the player - character.send(new UpdateWalletEvent(REWARD)); + character.send(new WalletTransactionEvent(REWARD)); // Remove the minmap overlay character.send(new RemoveBeaconOverlayEvent(activeQuestEntity)); diff --git a/src/main/java/org/terasology/metalrenegades/world/BaseFlatWorldRasterizer.java b/src/main/java/org/terasology/metalrenegades/world/BaseFlatWorldRasterizer.java index c7f969a9..f0bdbea7 100644 --- a/src/main/java/org/terasology/metalrenegades/world/BaseFlatWorldRasterizer.java +++ b/src/main/java/org/terasology/metalrenegades/world/BaseFlatWorldRasterizer.java @@ -39,7 +39,7 @@ public void generateChunk(CoreChunk chunk, Region chunkRegion) { for (Vector3i position : chunkRegion.getRegion()) { float surfaceHeight = surfaceHeightFacet.getWorld(position.x, position.z); if (position.y < surfaceHeight) { - chunk.setBlock(ChunkMath.calcBlockPos(position), dirt); + chunk.setBlock(ChunkMath.calcRelativeBlockPos(position), dirt); } } }