-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
608 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
{ | ||
"inherit": "inventoryDefault", | ||
"elements": { | ||
"UIInteractionWrapper": { | ||
"fixed-width": 48, | ||
"fixed-height": 48, | ||
"texture-scale-mode": "scale fit", | ||
"text-align-horizontal": "right", | ||
"text-align-vertical": "bottom", | ||
"margin": { | ||
"top": 4, | ||
"bottom": 4, | ||
"left": 4, | ||
"right": 4 | ||
} | ||
} | ||
}, | ||
"families": { | ||
"redText": { | ||
"text-color": "FF0000FF" | ||
}, | ||
"whiteText": { | ||
"text-color": "FFFFFFFF" | ||
}, | ||
"title":{ | ||
"font":"NotoSans-Regular-Large" | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
// Copyright 2021 The Terasology Foundation | ||
// SPDX-License-Identifier: Apache-2.0 | ||
package org.terasology.economy; | ||
|
||
import com.google.common.base.Preconditions; | ||
import org.terasology.economy.components.PurchasableComponent; | ||
import org.terasology.economy.components.ValueComponent; | ||
import org.terasology.economy.events.GiveItemTypeEvent; | ||
import org.terasology.engine.world.block.Block; | ||
import org.terasology.engine.world.block.BlockExplorer; | ||
import org.terasology.engine.world.block.BlockManager; | ||
import org.terasology.engine.world.block.BlockUri; | ||
import org.terasology.engine.world.block.family.BlockFamily; | ||
import org.terasology.gestalt.assets.management.AssetManager; | ||
import org.terasology.engine.entitySystem.ComponentContainer; | ||
import org.terasology.engine.entitySystem.entity.EntityRef; | ||
import org.terasology.engine.entitySystem.prefab.Prefab; | ||
import org.terasology.engine.entitySystem.systems.BaseComponentSystem; | ||
import org.terasology.engine.entitySystem.systems.RegisterSystem; | ||
import org.terasology.engine.logic.inventory.ItemComponent; | ||
import org.terasology.engine.logic.players.LocalPlayer; | ||
import org.terasology.engine.registry.In; | ||
import org.terasology.engine.registry.Share; | ||
|
||
import java.util.HashSet; | ||
import java.util.Set; | ||
import java.util.stream.Collectors; | ||
|
||
/** | ||
* Handles the purchasing of blocks | ||
*/ | ||
@RegisterSystem | ||
@Share(ShopManager.class) | ||
public class ShopManager extends BaseComponentSystem { | ||
private Set<Block> purchasableBlocks = new HashSet<>(); | ||
private Set<Prefab> purchasableItems = new HashSet<>(); | ||
|
||
@In | ||
private AssetManager assetManager; | ||
@In | ||
private BlockManager blockManager; | ||
@In | ||
private LocalPlayer localPlayer; | ||
/** | ||
* Gets how much money a ware will cost. | ||
* Tries to use the cost on the value component. | ||
* | ||
* @param ware The ware to get the price for | ||
* @return The price of the ware. | ||
*/ | ||
public static int getWareCost(ComponentContainer ware) { | ||
Preconditions.checkNotNull(ware.getComponent(ValueComponent.class), "Component Container does not contain a Value Component"); | ||
return ware.getComponent(ValueComponent.class).value; | ||
} | ||
|
||
@Override | ||
public void postBegin() { | ||
BlockExplorer blockExplorer = new BlockExplorer(assetManager); | ||
|
||
purchasableItems = assetManager.getLoadedAssets(Prefab.class) | ||
.stream() | ||
.filter(prefab -> prefab.hasComponent(ItemComponent.class) | ||
&& prefab.hasComponent(PurchasableComponent.class)) | ||
.collect(Collectors.toSet()); | ||
|
||
Set<BlockUri> blocks = new HashSet<>(); | ||
blocks.addAll(blockManager.listRegisteredBlockUris()); | ||
blocks.addAll(blockExplorer.getAvailableBlockFamilies()); | ||
blocks.addAll(blockExplorer.getFreeformBlockFamilies()); | ||
|
||
purchasableBlocks = blocks.stream() | ||
.map(blockManager::getBlockFamily) | ||
.map(BlockFamily::getArchetypeBlock) | ||
.filter(block -> block.getPrefab().isPresent()) | ||
.filter(block -> block.getPrefab().get().hasComponent(PurchasableComponent.class)) | ||
.collect(Collectors.toSet()); | ||
} | ||
|
||
/** | ||
* @return All the blocks for sale | ||
*/ | ||
public Set<Block> getAllBlocks() { | ||
return purchasableBlocks; | ||
} | ||
|
||
/** | ||
* @return All the items for sale | ||
*/ | ||
public Set<Prefab> getAllItems() { | ||
return purchasableItems; | ||
} | ||
|
||
/** | ||
* Attempt to purchase a block. | ||
* | ||
* @param block The block to purchase | ||
*/ | ||
public void purchaseBlock(Block block) { | ||
EntityRef character = localPlayer.getCharacterEntity(); | ||
String blockURI = block.toString(); | ||
character.send(new GiveItemTypeEvent(blockURI)); | ||
} | ||
|
||
public void purchaseItem(Prefab prefab) { | ||
EntityRef character = localPlayer.getCharacterEntity(); | ||
character.send(new GiveItemTypeEvent(prefab)); | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
src/main/java/org/terasology/economy/components/PurchasableComponent.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// Copyright 2021 The Terasology Foundation | ||
// SPDX-License-Identifier: Apache-2.0 | ||
package org.terasology.economy.components; | ||
|
||
import org.terasology.engine.entitySystem.Component; | ||
import org.terasology.engine.world.block.items.AddToBlockBasedItem; | ||
|
||
/** | ||
* Indicates that the item can be bought and thus will be available in the shop | ||
*/ | ||
@AddToBlockBasedItem | ||
public class PurchasableComponent implements Component { | ||
} |
18 changes: 18 additions & 0 deletions
18
src/main/java/org/terasology/economy/components/ValueComponent.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
// Copyright 2021 The Terasology Foundation | ||
// SPDX-License-Identifier: Apache-2.0 | ||
package org.terasology.economy.components; | ||
|
||
import org.terasology.engine.entitySystem.Component; | ||
import org.terasology.engine.world.block.items.AddToBlockBasedItem; | ||
|
||
/** | ||
* Indicates that the given entity has a value. | ||
*/ | ||
@AddToBlockBasedItem | ||
public class ValueComponent implements Component { | ||
|
||
/** | ||
* How much money one instance of this entity is worth | ||
*/ | ||
public int value; | ||
} |
36 changes: 36 additions & 0 deletions
36
src/main/java/org/terasology/economy/events/GiveItemTypeEvent.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
// Copyright 2021 The Terasology Foundation | ||
// SPDX-License-Identifier: Apache-2.0 | ||
package org.terasology.economy.events; | ||
|
||
import org.terasology.engine.entitySystem.event.Event; | ||
import org.terasology.engine.entitySystem.prefab.Prefab; | ||
import org.terasology.engine.network.ServerEvent; | ||
|
||
/** | ||
* Trigger event that sends the required item (as a string/prefab) to the server. | ||
* It then creates the item entity and gives the item on the server. | ||
*/ | ||
@ServerEvent | ||
public class GiveItemTypeEvent implements Event { | ||
Prefab targetPrefab; | ||
String blockURI; | ||
|
||
private GiveItemTypeEvent() { | ||
} | ||
|
||
public GiveItemTypeEvent(Prefab targetPrefab) { | ||
this.targetPrefab = targetPrefab; | ||
} | ||
|
||
public GiveItemTypeEvent(String blockURI) { | ||
this.blockURI = blockURI; | ||
} | ||
|
||
public Prefab getTargetPrefab() { | ||
return targetPrefab; | ||
} | ||
|
||
public String getBlockURI() { | ||
return blockURI; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
61 changes: 61 additions & 0 deletions
61
src/main/java/org/terasology/economy/systems/ItemAuthoritySystem.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
// Copyright 2021 The Terasology Foundation | ||
// SPDX-License-Identifier: Apache-2.0 | ||
package org.terasology.economy.systems; | ||
|
||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.terasology.economy.components.ValueComponent; | ||
import org.terasology.economy.events.WalletTransactionEvent; | ||
import org.terasology.engine.entitySystem.entity.EntityManager; | ||
import org.terasology.engine.entitySystem.entity.EntityRef; | ||
import org.terasology.engine.entitySystem.event.ReceiveEvent; | ||
import org.terasology.engine.entitySystem.systems.BaseComponentSystem; | ||
import org.terasology.engine.entitySystem.systems.RegisterMode; | ||
import org.terasology.engine.entitySystem.systems.RegisterSystem; | ||
import org.terasology.engine.logic.inventory.events.GiveItemEvent; | ||
import org.terasology.engine.registry.In; | ||
import org.terasology.economy.events.GiveItemTypeEvent; | ||
import org.terasology.engine.world.block.BlockManager; | ||
import org.terasology.engine.world.block.family.BlockFamily; | ||
import org.terasology.engine.world.block.items.BlockItemFactory; | ||
import org.terasology.module.inventory.systems.InventoryAuthoritySystem; | ||
|
||
@RegisterSystem(RegisterMode.AUTHORITY) | ||
public class ItemAuthoritySystem extends BaseComponentSystem { | ||
|
||
@In | ||
private WalletAuthoritySystem walletAuthoritySystem; | ||
@In | ||
private EntityManager entityManager; | ||
@In | ||
private BlockManager blockManager; | ||
|
||
private BlockItemFactory blockItemFactory; | ||
|
||
private Logger logger = LoggerFactory.getLogger(InventoryAuthoritySystem.class); | ||
|
||
@Override | ||
public void postBegin() { | ||
blockItemFactory = new BlockItemFactory(entityManager); | ||
} | ||
|
||
@ReceiveEvent | ||
public void onGiveItemToPlayer(GiveItemTypeEvent event, EntityRef entity) { | ||
if (event.getTargetPrefab() != null && event.getTargetPrefab().hasComponent(ValueComponent.class)) { | ||
EntityRef item = entityManager.create(event.getTargetPrefab()); | ||
if (walletAuthoritySystem.isValidTransaction(entity, -item.getComponent(ValueComponent.class).value)) { | ||
entity.send(new WalletTransactionEvent(-item.getComponent(ValueComponent.class).value)); | ||
item.send(new GiveItemEvent(entity)); | ||
} | ||
} else if (event.getBlockURI() != null) { | ||
BlockFamily blockFamily = blockManager.getBlockFamily(event.getBlockURI()); | ||
EntityRef blockItem = blockItemFactory.newInstance(blockFamily); | ||
if (walletAuthoritySystem.isValidTransaction(entity, -blockItem.getComponent(ValueComponent.class).value)) { | ||
entity.send(new WalletTransactionEvent(-blockItem.getComponent(ValueComponent.class).value)); | ||
blockItem.send(new GiveItemEvent(entity)); | ||
} | ||
} else { | ||
logger.warn("Prefab/String is null"); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.