Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 2 additions & 21 deletions src/blocks.zig
Original file line number Diff line number Diff line change
Expand Up @@ -28,31 +28,12 @@ const BlockTouchCallback = main.callbacks.BlockTouchCallback;
const sbb = main.server.terrain.sbb;
const blueprint = main.blueprint;
const Assets = main.assets.Assets;
const BlockDrop = main.server.BlockDrop;

const c = @import("c");

pub const maxBlockCount: usize = 65536; // 16 bit limit

pub const BlockDrop = struct {
items: []const items.ItemStack,
chance: f32,
forbiddenToolTags: []Tag,
allowedToolTags: ?[]Tag = null,

pub fn isDroppedWhenBrokenWithItem(self: BlockDrop, item: Item) bool {
if (item != .proceduralItem) return self.allowedToolTags == null;

const proceduralItem = item.proceduralItem;
for (self.forbiddenToolTags) |tag| if (proceduralItem.hasTag(tag)) return false;
if (self.allowedToolTags) |tags| {
for (tags) |tag| if (proceduralItem.hasTag(tag)) return true;
return false;
}

return true;
}
};

/// Ores can be found underground in veins.
/// TODO: Add support for non-stone ores.
pub const Ore = struct {
Expand Down Expand Up @@ -271,7 +252,7 @@ pub fn loadBlockDrop(blockId: []const u8, zon: ZonElement) []const BlockDrop {
}

blockDrops[i] = .{
.items = resultItems.items,
.itemStacks = resultItems.items,
.chance = blockDrop.get(f32, "chance") orelse 1,
.forbiddenToolTags = Tag.loadTagsFromZon(main.worldArena, blockDrop.getChild("forbiddenToolTags")),
.allowedToolTags = allowedToolTags,
Expand Down
2 changes: 1 addition & 1 deletion src/callbacks/block/server/check_support_blocks.zig
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ pub fn run(_: *@This(), params: main.callbacks.ServerBlockCallback.Params) main.
for (drops) |drop| {
if (!drop.isDroppedWhenBrokenWithItem(.null)) continue;
if (drop.chance == 1 or main.random.nextFloat(&main.seed) < drop.chance) {
for (drop.items) |stack| {
for (drop.itemStacks) |stack| {
var dir = main.vec.normalize(main.random.nextFloatVectorSigned(3, &main.seed));
// Bias upwards
dir[2] += main.random.nextFloat(&main.seed)*4.0;
Expand Down
5 changes: 3 additions & 2 deletions src/callbacks/block/server/decay.zig
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ const Vec3f = vec.Vec3f;
const ZonElement = main.ZonElement;
const server = main.server;
const branch = main.rotation.rotations.@"cubyz:branch";
const BlockDrop = main.server.BlockDrop;

decayReplacement: blocks.Block,
prevention: []const main.Tag,
blockDrops: []const blocks.BlockDrop,
blockDrops: []const BlockDrop,

pub fn init(zon: ZonElement, creator: main.callbacks.Creator) ?*@This() {
const block = switch (creator) {
Expand Down Expand Up @@ -136,7 +137,7 @@ pub fn run(self: *@This(), params: main.callbacks.ServerBlockCallback.Params) ma
if (world.cmpxchgBlock(wx, wy, wz, leaf, self.decayReplacement) == null) {
for (self.blockDrops) |drop| {
if (drop.chance == 1 or main.random.nextFloat(&main.seed) < drop.chance) {
for (drop.items) |stack| {
for (drop.itemStacks) |stack| {
var dir = main.vec.normalize(main.random.nextFloatVectorSigned(3, &main.seed));
// Bias upwards
dir[2] += main.random.nextFloat(&main.seed)*4.0;
Expand Down
22 changes: 22 additions & 0 deletions src/server/BlockDrop.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const main = @import("main");
const Tag = main.Tag;
const items = main.items;
const Item = items.Item;

itemStacks: []const items.ItemStack,
chance: f32,
forbiddenToolTags: []Tag,
allowedToolTags: ?[]Tag = null,

pub fn isDroppedWhenBrokenWithItem(self: @This(), item: Item) bool {
if (item != .proceduralItem) return self.allowedToolTags == null;

const proceduralItem = item.proceduralItem;
for (self.forbiddenToolTags) |tag| if (proceduralItem.hasTag(tag)) return false;
if (self.allowedToolTags) |tags| {
for (tags) |tag| if (proceduralItem.hasTag(tag)) return true;
return false;
}

return true;
}
1 change: 1 addition & 0 deletions src/server/server.zig
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ pub const stdin_handler = @import("stdin_handler.zig");
pub const storage = @import("storage.zig");
pub const permission = @import("permission.zig");
pub const players = @import("players.zig");
pub const BlockDrop = @import("BlockDrop.zig");

pub const command = @import("command.zig");

Expand Down
11 changes: 6 additions & 5 deletions src/sync.zig
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const Vec3d = vec.Vec3d;
const Vec3f = vec.Vec3f;
const Vec3i = vec.Vec3i;
const ZonElement = main.ZonElement;
const BlockDrop = main.server.BlockDrop;

const @"cubyz:bag" = main.entity.components.@"cubyz:bag";

Expand Down Expand Up @@ -1549,15 +1550,15 @@ pub const Command = struct { // MARK: Command
min: Vec3f,
max: Vec3f,

pub fn drop(self: BlockDropLocation, pos: Vec3i, newBlock: Block, _drop: main.blocks.BlockDrop) void {
pub fn drop(self: BlockDropLocation, pos: Vec3i, newBlock: Block, _drop: BlockDrop) void {
if (newBlock.collide()) {
self.dropOutside(pos, _drop);
} else {
self.dropInside(pos, _drop);
}
}
fn dropInside(self: BlockDropLocation, pos: Vec3i, _drop: main.blocks.BlockDrop) void {
for (_drop.items) |itemStack| {
fn dropInside(self: BlockDropLocation, pos: Vec3i, _drop: BlockDrop) void {
for (_drop.itemStacks) |itemStack| {
main.server.world.?.drop(itemStack.clone(), self.insidePos(pos), self.dropDir(), self.dropVelocity());
}
}
Expand All @@ -1572,8 +1573,8 @@ pub const Command = struct { // MARK: Command
const width = (max - min)*half;
return center + width*main.random.nextFloatVectorSigned(3, &main.seed)*half;
}
fn dropOutside(self: BlockDropLocation, pos: Vec3i, _drop: main.blocks.BlockDrop) void {
for (_drop.items) |itemStack| {
fn dropOutside(self: BlockDropLocation, pos: Vec3i, _drop: BlockDrop) void {
for (_drop.itemStacks) |itemStack| {
main.server.world.?.drop(itemStack.clone(), self.outsidePos(pos), self.dropDir(), self.dropVelocity());
}
}
Expand Down
Loading