Skip to content

Commit

Permalink
revert changes
Browse files Browse the repository at this point in the history
  • Loading branch information
ahv15 committed Aug 24, 2021
1 parent 109b642 commit 21435a7
Show file tree
Hide file tree
Showing 10 changed files with 608 additions and 1 deletion.
29 changes: 29 additions & 0 deletions assets/skins/ShopDefault.skin
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"
}
}
}
108 changes: 108 additions & 0 deletions src/main/java/org/terasology/economy/ShopManager.java
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));
}
}
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 {
}
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 src/main/java/org/terasology/economy/events/GiveItemTypeEvent.java
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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
package org.terasology.economy.events;

import org.terasology.engine.entitySystem.event.Event;
import org.terasology.engine.network.ServerEvent;

/**
* Fired when a currency transaction must occur.
*/
@ServerEvent
public class WalletTransactionEvent implements Event {

/**
Expand Down
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");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
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.players.LocalPlayer;
import org.terasology.engine.registry.In;
import org.terasology.engine.rendering.nui.NUIManager;
import org.terasology.nui.databinding.Binding;
Expand All @@ -22,6 +23,8 @@ public class WalletClientSystem extends BaseComponentSystem {

@In
private NUIManager nuiManager;
@In
private LocalPlayer localPlayer;

private Binding<String> walletBalance = new DefaultBinding<>("");

Expand All @@ -32,6 +35,8 @@ public void preBegin() {

@ReceiveEvent
public void onUpdateWallet(WalletUpdatedEvent event, EntityRef character) {
walletBalance.set(String.valueOf(event.amount));
if (localPlayer.getCharacterEntity().equals(character)) {
walletBalance.set(String.valueOf(event.amount));
}
}
}
Loading

0 comments on commit 21435a7

Please sign in to comment.