mirror of
https://github.com/PixelGuys/Cubyz.git
synced 2025-09-10 04:41:32 -04:00
parent
25a8e2959a
commit
b271a416bc
@ -289,6 +289,34 @@ pub const Sync = struct { // MARK: Sync
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn tryCollectingToPlayerInventory(user: *main.server.User, itemStack: *ItemStack) void {
|
||||||
|
if(itemStack.item == null) return;
|
||||||
|
mutex.lock();
|
||||||
|
defer mutex.unlock();
|
||||||
|
var inventoryIdIterator = user.inventoryClientToServerIdMap.valueIterator();
|
||||||
|
outer: while(inventoryIdIterator.next()) |inventoryId| {
|
||||||
|
if(inventories.items[inventoryId.*].source == .playerInventory) {
|
||||||
|
const inv = inventories.items[inventoryId.*].inv;
|
||||||
|
for(inv._items, 0..) |invStack, slot| {
|
||||||
|
if(std.meta.eql(invStack.item, itemStack.item)) {
|
||||||
|
const amount = @min(itemStack.item.?.stackSize() - invStack.amount, itemStack.amount);
|
||||||
|
executeCommand(.{.fillFromCreative = .{.dest = .{.inv = inv, .slot = @intCast(slot)}, .item = itemStack.item, .amount = invStack.amount + amount}}, null);
|
||||||
|
itemStack.amount -= amount;
|
||||||
|
if(itemStack.amount == 0) break :outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(inv._items, 0..) |invStack, slot| {
|
||||||
|
if(invStack.item == null) {
|
||||||
|
executeCommand(.{.fillFromCreative = .{.dest = .{.inv = inv, .slot = @intCast(slot)}, .item = itemStack.item, .amount = itemStack.amount}}, null);
|
||||||
|
itemStack.amount = 0;
|
||||||
|
break :outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(itemStack.amount == 0) itemStack.item = null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn getInventory(id: u32, side: Side, user: ?*main.server.User) ?Inventory {
|
pub fn getInventory(id: u32, side: Side, user: ?*main.server.User) ?Inventory {
|
||||||
@ -949,7 +977,7 @@ pub const Command = struct { // MARK: Command
|
|||||||
if(_items[0].item != null) {
|
if(_items[0].item != null) {
|
||||||
if(side == .server) {
|
if(side == .server) {
|
||||||
const direction = vec.rotateZ(vec.rotateX(Vec3f{0, 1, 0}, -user.?.player.rot[0]), -user.?.player.rot[2]);
|
const direction = vec.rotateZ(vec.rotateX(Vec3f{0, 1, 0}, -user.?.player.rot[0]), -user.?.player.rot[2]);
|
||||||
main.server.world.?.drop(_items[0].clone(), user.?.player.pos, direction, 20);
|
main.server.world.?.dropWithCooldown(_items[0], user.?.player.pos, direction, 20, main.server.updatesPerSec*2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -957,13 +985,14 @@ pub const Command = struct { // MARK: Command
|
|||||||
if(self.source.inv.type == .workbench and self.source.slot == 25) {
|
if(self.source.inv.type == .workbench and self.source.slot == 25) {
|
||||||
cmd.removeToolCraftingIngredients(allocator, self.source.inv, side);
|
cmd.removeToolCraftingIngredients(allocator, self.source.inv, side);
|
||||||
}
|
}
|
||||||
|
const amount = @min(self.source.ref().amount, self.desiredAmount);
|
||||||
if(side == .server) {
|
if(side == .server) {
|
||||||
const direction = vec.rotateZ(vec.rotateX(Vec3f{0, 1, 0}, -user.?.player.rot[0]), -user.?.player.rot[2]);
|
const direction = vec.rotateZ(vec.rotateX(Vec3f{0, 1, 0}, -user.?.player.rot[0]), -user.?.player.rot[2]);
|
||||||
main.server.world.?.drop(self.source.ref().clone(), user.?.player.pos, direction, 20);
|
main.server.world.?.dropWithCooldown(.{.item = self.source.ref().item.?.clone(), .amount = amount}, user.?.player.pos, direction, 20, main.server.updatesPerSec*2);
|
||||||
}
|
}
|
||||||
cmd.executeBaseOperation(allocator, .{.delete = .{
|
cmd.executeBaseOperation(allocator, .{.delete = .{
|
||||||
.source = self.source,
|
.source = self.source,
|
||||||
.amount = @min(self.source.ref().amount, self.desiredAmount),
|
.amount = amount,
|
||||||
}}, side);
|
}}, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,6 +382,33 @@ pub const ItemDropManager = struct { // MARK: ItemDropManager
|
|||||||
}
|
}
|
||||||
return main.game.collision.collideWithBlock(block, blockPos[0], blockPos[1], blockPos[2], pos.*, @splat(radius), @splat(0)) != null;
|
return main.game.collision.collideWithBlock(block, blockPos[0], blockPos[1], blockPos[2], pos.*, @splat(radius), @splat(0)) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn checkEntity(self: *ItemDropManager, user: *main.server.User) void {
|
||||||
|
self.mutex.lock();
|
||||||
|
defer self.mutex.unlock();
|
||||||
|
var ii: u32 = 0;
|
||||||
|
while(ii < self.size) {
|
||||||
|
const i = self.indices[ii];
|
||||||
|
if(self.list.items(.pickupCooldown)[i] > 0) {
|
||||||
|
ii += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const hitbox = main.game.Player.outerBoundingBox;
|
||||||
|
const min = user.player.pos + hitbox.min;
|
||||||
|
const max = user.player.pos + hitbox.max;
|
||||||
|
const itemPos = self.list.items(.pos)[i];
|
||||||
|
const dist = @max(min - itemPos, itemPos - max);
|
||||||
|
if(@reduce(.Max, dist) < radius + pickupRange) {
|
||||||
|
const itemStack = &self.list.items(.itemStack)[i];
|
||||||
|
main.items.Inventory.Sync.ServerSide.tryCollectingToPlayerInventory(user, itemStack);
|
||||||
|
if(itemStack.amount == 0) {
|
||||||
|
self.removeLocked(i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ii += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const ClientItemDropManager = struct { // MARK: ClientItemDropManager
|
pub const ClientItemDropManager = struct { // MARK: ClientItemDropManager
|
||||||
|
@ -824,6 +824,14 @@ pub const ServerWorld = struct { // MARK: ServerWorld
|
|||||||
|
|
||||||
// Item Entities
|
// Item Entities
|
||||||
self.itemDropManager.update(deltaTime);
|
self.itemDropManager.update(deltaTime);
|
||||||
|
{ // Collect item entities:
|
||||||
|
self.lastUnimportantDataSent = newTime;
|
||||||
|
server.mutex.lock();
|
||||||
|
defer server.mutex.unlock();
|
||||||
|
for(server.users.items) |user| {
|
||||||
|
self.itemDropManager.checkEntity(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Store chunks and regions.
|
// Store chunks and regions.
|
||||||
// Stores at least one chunk and one region per iteration.
|
// Stores at least one chunk and one region per iteration.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user