Skip to content

Commit b1e9d4f

Browse files
Merge pull request #544 from VolmitSoftware/Development
1.16.7
2 parents 4d04a25 + be86670 commit b1e9d4f

File tree

3 files changed

+76
-13
lines changed

3 files changed

+76
-13
lines changed

src/main/java/com/volmit/adapt/api/world/AdaptPlayer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ public void boostXPToRecents(double boost, int ms) {
294294
}
295295

296296
public void loggedIn() {
297+
lastSeen = M.ms();
297298
if (AdaptConfig.get().isLoginBonus()) {
298299
long timeGone = M.ms() - getData().getLastLogin();
299300
boolean first = getData().getLastLogin() == 0;

src/main/java/com/volmit/adapt/content/adaptation/pickaxe/PickaxeSilkSpawner.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.volmit.adapt.util.C;
55
import com.volmit.adapt.util.Element;
66
import com.volmit.adapt.util.Localizer;
7+
import com.volmit.adapt.util.RNG;
78
import com.volmit.adapt.util.collection.KList;
89
import lombok.NoArgsConstructor;
910
import org.bukkit.Bukkit;
@@ -15,8 +16,10 @@
1516
import org.bukkit.event.block.BlockBreakEvent;
1617
import org.bukkit.event.block.BlockDropItemEvent;
1718
import org.bukkit.inventory.ItemStack;
19+
import org.bukkit.inventory.meta.BlockStateMeta;
1820

1921
public class PickaxeSilkSpawner extends SimpleAdaptation<PickaxeSilkSpawner.Config> {
22+
private final RNG rng = new RNG();
2023

2124
public PickaxeSilkSpawner() {
2225
super("pickaxe-silk-spawner");
@@ -45,14 +48,32 @@ public void onBlockBreak(BlockBreakEvent event) {
4548
}
4649

4750
event.setDropItems(false);
48-
var items = new KList<Item>();
49-
block.getWorld().dropItemNaturally(block.getLocation(), new ItemStack(Material.SPAWNER), items::add);
51+
var spawner = new ItemStack(Material.SPAWNER);
52+
var state = block.getState();
53+
if (spawner.getItemMeta() instanceof BlockStateMeta meta) {
54+
meta.setBlockState(state);
55+
spawner.setItemMeta(meta);
56+
}
57+
58+
var loc = block.getLocation().add(
59+
rng.d(-0.25D, 0.25D),
60+
rng.d(-0.25D, 0.25D) - 0.125D,
61+
rng.d(-0.25D, 0.25D)
62+
);
63+
var item = block.getWorld().createEntity(loc, Item.class);
64+
item.setItemStack(spawner);
65+
item.setOwner(player.getUniqueId());
5066

51-
var dropEvent = new BlockDropItemEvent(block, block.getState(), player, items);
67+
var dropEvent = new BlockDropItemEvent(block, state, player, new KList<Item>().qadd(item));
5268
Bukkit.getPluginManager().callEvent(dropEvent);
53-
if (dropEvent.isCancelled() && !items.isEmpty()) {
54-
items.forEach(Item::remove);
55-
items.clear();
69+
if (dropEvent.isCancelled()) {
70+
for (Item i : dropEvent.getItems()) {
71+
if (i.isValid()) i.remove();
72+
}
73+
} else {
74+
for (Item i : dropEvent.getItems()) {
75+
if (!i.isValid()) block.getWorld().addEntity(i);
76+
}
5677
}
5778
}
5879

src/main/java/com/volmit/adapt/content/adaptation/rift/RiftAccess.java

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import com.volmit.adapt.api.recipe.AdaptRecipe;
2525
import com.volmit.adapt.content.item.BoundEnderPearl;
2626
import com.volmit.adapt.util.*;
27+
import lombok.EqualsAndHashCode;
2728
import lombok.NoArgsConstructor;
29+
import manifold.rt.api.util.Pair;
2830
import org.bukkit.*;
2931
import org.bukkit.block.Block;
3032
import org.bukkit.entity.Player;
@@ -38,17 +40,19 @@
3840
import org.bukkit.inventory.ItemStack;
3941
import us.lynuxcraft.deadsilenceiv.advancedchests.AdvancedChestsAPI;
4042

43+
import java.lang.ref.WeakReference;
4144
import java.util.ArrayList;
4245
import java.util.Iterator;
4346
import java.util.List;
4447
import java.util.Map;
4548
import java.util.concurrent.ConcurrentHashMap;
49+
import java.util.concurrent.atomic.AtomicInteger;
4650

4751
import static com.volmit.adapt.api.adaptation.chunk.ChunkLoading.loadChunkAsync;
4852

4953
public class RiftAccess extends SimpleAdaptation<RiftAccess.Config> {
50-
private final Map<Location, List<InventoryView>> activeViewsMap = new ConcurrentHashMap<>();
51-
54+
private final Map<Pair<ChunkPos, Location>, List<InventoryView>> activeViewsMap = new ConcurrentHashMap<>();
55+
private final Map<ChunkPos, AtomicInteger> tickets = new ConcurrentHashMap<>();
5256

5357
public RiftAccess() {
5458
super("rift-access");
@@ -168,7 +172,7 @@ private void openPearl(Player p) {
168172
} else if (b.getState() instanceof InventoryHolder holder) {
169173
InventoryView view = p.openInventory(holder.getInventory());
170174
if (view == null) return;
171-
activeViewsMap.computeIfAbsent(b.getLocation(), k -> new ArrayList<>()).add(view);
175+
activeViewsMap.computeIfAbsent(Pair.make(new ChunkPos(chunk).add(), b.getLocation()), k -> new ArrayList<>()).add(view);
172176
}
173177
sp.play(p.getLocation(), Sound.PARTICLE_SOUL_ESCAPE, 1f, 0.10f);
174178
sp.play(p.getLocation(), Sound.BLOCK_ENDER_CHEST_OPEN, 1f, 0.10f);
@@ -181,15 +185,15 @@ public void onTick() {
181185
}
182186

183187
private void checkActiveViews() {
184-
Iterator<Map.Entry<Location, List<InventoryView>>> mapIterator = activeViewsMap.entrySet().iterator();
188+
Iterator<Map.Entry<Pair<ChunkPos, Location>, List<InventoryView>>> mapIterator = activeViewsMap.entrySet().iterator();
185189
while (mapIterator.hasNext()) {
186-
Map.Entry<Location, List<InventoryView>> entry = mapIterator.next();
190+
Map.Entry<Pair<ChunkPos, Location>, List<InventoryView>> entry = mapIterator.next();
187191
removeInvalidViews(entry);
188192
removeEntryIfViewsEmpty(mapIterator, entry);
189193
}
190194
}
191195

192-
private void removeInvalidViews(Map.Entry<Location, List<InventoryView>> entry) {
196+
private void removeInvalidViews(Map.Entry<Pair<ChunkPos, Location>, List<InventoryView>> entry) {
193197
List<InventoryView> views = entry.getValue();
194198
for (int ii = views.size() - 1; ii >= 0; ii--) {
195199
InventoryView i = views.get(ii);
@@ -204,10 +208,11 @@ private boolean shouldRemoveView(InventoryView i) {
204208
return !i.getPlayer().getOpenInventory().equals(i) || (location == null || !isStorage(location.getBlock().getBlockData()));
205209
}
206210

207-
private void removeEntryIfViewsEmpty(Iterator<Map.Entry<Location, List<InventoryView>>> mapIterator, Map.Entry<Location, List<InventoryView>> entry) {
211+
private void removeEntryIfViewsEmpty(Iterator<Map.Entry<Pair<ChunkPos, Location>, List<InventoryView>>> mapIterator, Map.Entry<Pair<ChunkPos, Location>, List<InventoryView>> entry) {
208212
List<InventoryView> views = entry.getValue();
209213
if (views.isEmpty()) {
210214
mapIterator.remove();
215+
entry.getKey().getFirst().remove();
211216
}
212217
}
213218

@@ -281,4 +286,40 @@ protected static class Config {
281286
double costFactor = 0.2;
282287
int initialCost = 15;
283288
}
289+
290+
@EqualsAndHashCode
291+
private class ChunkPos {
292+
@EqualsAndHashCode.Exclude
293+
private final WeakReference<World> world;
294+
private final String name;
295+
private final int x, z;
296+
297+
private ChunkPos(Chunk chunk) {
298+
this.world = new WeakReference<>(chunk.getWorld());
299+
this.name = chunk.getWorld().getName();
300+
this.x = chunk.getX();
301+
this.z = chunk.getZ();
302+
}
303+
304+
public ChunkPos add() {
305+
World world = this.world.get();
306+
if (world == null) return this;
307+
if (tickets.computeIfAbsent(this, k -> new AtomicInteger()).getAndIncrement() == 0)
308+
world.addPluginChunkTicket(x, z, Adapt.instance);
309+
return this;
310+
}
311+
312+
public void remove() {
313+
World world = this.world.get();
314+
if (world == null) {
315+
tickets.remove(this);
316+
return;
317+
}
318+
if (tickets.computeIfAbsent(this, k -> new AtomicInteger()).decrementAndGet() <= 0) {
319+
world.removePluginChunkTicket(x, z, Adapt.instance);
320+
world.unloadChunkRequest(x, z);
321+
tickets.remove(this);
322+
}
323+
}
324+
}
284325
}

0 commit comments

Comments
 (0)