-
Notifications
You must be signed in to change notification settings - Fork 14
/
SettlementCachingSystem.java
119 lines (103 loc) · 4.93 KB
/
SettlementCachingSystem.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
* Copyright 2016 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.dynamicCities.settlements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.dynamicCities.minimap.events.AddCentreOverlayEvent;
import org.terasology.dynamicCities.minimap.events.AddDistrictOverlayEvent;
import org.terasology.dynamicCities.minimap.events.RemoveDistrictOverlayEvent;
import org.terasology.dynamicCities.playerTracking.OnEnterSettlementEvent;
import org.terasology.dynamicCities.settlements.components.ActiveSettlementComponent;
import org.terasology.dynamicCities.settlements.events.SettlementRegisterEvent;
import org.terasology.entitySystem.entity.EntityManager;
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.network.ClientComponent;
import org.terasology.network.NetworkComponent;
import org.terasology.network.NetworkSystem;
import org.terasology.network.events.DisconnectedEvent;
import org.terasology.registry.In;
import org.terasology.registry.Share;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@Share(SettlementCachingSystem.class)
@RegisterSystem(RegisterMode.AUTHORITY)
public class SettlementCachingSystem extends BaseComponentSystem {
private EntityRef settlementEntities;
@In
private EntityManager entityManager;
@In
private NetworkSystem networkSystem;
private Logger logger = LoggerFactory.getLogger(SettlementCachingSystem.class);
private boolean isInitialised;
@Override
public void postBegin() {
Iterator<EntityRef> settlementEntitiesIterator = entityManager.getEntitiesWith(SettlementsCacheComponent.class).iterator();
settlementEntities = settlementEntitiesIterator.hasNext() ? settlementEntitiesIterator.next() : null;
if (settlementEntities == null) {
NetworkComponent networkComponent = new NetworkComponent();
networkComponent.replicateMode = NetworkComponent.ReplicateMode.ALWAYS;
SettlementsCacheComponent settlementsCacheComponent = new SettlementsCacheComponent();
settlementsCacheComponent.settlementEntities = new HashMap<>();
settlementsCacheComponent.networkCache = new ArrayList<>();
settlementEntities = entityManager.create(settlementsCacheComponent, networkComponent);
settlementEntities.setAlwaysRelevant(true);
} else {
SettlementsCacheComponent settlementsCacheComponent = settlementEntities.getComponent(SettlementsCacheComponent.class);
if (settlementsCacheComponent.networkCache == null) {
settlementsCacheComponent.networkCache = new ArrayList<>();
}
if (settlementsCacheComponent.settlementEntities == null) {
settlementsCacheComponent.settlementEntities = new HashMap<>();
}
}
isInitialised = true;
}
@ReceiveEvent(components = {ActiveSettlementComponent.class})
public void registerSettlement(SettlementRegisterEvent event, EntityRef settlement) {
SettlementsCacheComponent container = settlementEntities.getComponent(SettlementsCacheComponent.class);
container.add(settlement);
container.networkCache.add(settlement);
settlementEntities.saveComponent(container);
}
@ReceiveEvent
public void addOverlayToClient(OnEnterSettlementEvent event, EntityRef player) {
player.send(new AddDistrictOverlayEvent());
player.send(new AddCentreOverlayEvent());
}
@ReceiveEvent
public void removeOverlayOfClient(DisconnectedEvent event, EntityRef client) {
client.getComponent(ClientComponent.class).character.send(new RemoveDistrictOverlayEvent());
}
public SettlementsCacheComponent getSettlementEntitiesComponent() {
if (settlementEntities.hasComponent(SettlementsCacheComponent.class)) {
return settlementEntities.getComponent(SettlementsCacheComponent.class);
} else {
logger.error("No settlementEntitiesComponent found!");
return null;
}
}
public EntityRef getSettlementCacheEntity() {
return settlementEntities;
}
public boolean isInitialised() {
return isInitialised;
}
}