add first patch

This commit is contained in:
2026-07-31 10:34:32 +09:00
parent 03aac2e45e
commit b1cbc6c78d
6390 changed files with 547430 additions and 0 deletions
@@ -0,0 +1,59 @@
console.info("[SOCIETY] cancelItemEvents.js loaded");
ItemEvents.rightClicked("brewery:dark_brew", (e) => {
if (!e.player.isCrouching()) e.cancel();
});
ItemEvents.rightClicked("farm_and_charm:fertilizer", (e) => {
e.cancel();
});
BlockEvents.rightClicked("create:deployer", (e) => {
if (
[
"minecraft:fishing_rod",
"netherdepthsupgrade:lava_fishing_rod",
"aquaculture:iron_fishing_rod",
"aquaculture:gold_fishing_rod",
"aquaculture:diamond_fishing_rod",
"aquaculture:neptunium_fishing_rod",
].includes(e.player.getHeldItem("MAIN_HAND").id)
) {
e.player.tell(Text.translatable("society.fishing_rod.on_deployer").red());
e.cancel();
}
});
ItemEvents.rightClicked(
["refinedstorage:4k_storage_block", "refinedstorage:64k_storage_block"],
(e) => {
if (e.player.isCrouching()) e.cancel();
},
);
ItemEvents.rightClicked(
[
"buildinggadgets2:gadget_copy_paste",
"buildinggadgets2:gadget_exchanging",
"buildinggadgets2:gadget_copy_paste",
"buildinggadgets2:gadget_cut_paste",
"buildinggadgets2:gadget_destruction",
"botania:smelt_rod",
"supplementaries:wrench"
],
(e) => {
if (e.player.level.dimension === "society:skull_cavern") {
// TODO: Dialog
e.player.tell(Text.red("Don't do that."))
e.cancel();
}
},
);
BlockEvents.rightClicked((e) => {
if (e.player.getHeldItem("MAIN_HAND").hasTag("forge:tools/fishing_rods") && e.player.getHeldItem("OFF_HAND").hasTag("forge:tools/fishing_rods") && !e.block.id.equals("society:fish_pond")
) {
e.cancel();
}
});
@@ -0,0 +1,14 @@
console.info("[SOCIETY] cornucopia.js loaded");
ItemEvents.rightClicked("society:cornucopia", (e) => {
const { server, player, level, item, hand } = e;
if (player.isFake()) return;
if (hand == "OFF_HAND") return;
global.addItemCooldown(player, item, 40);
let experienceMult = global.handleCornucopia(server, level, player.getOnPos().above(), player, true);
global.giveExperience(server, player, "farming", experienceMult * 30);
});
@@ -0,0 +1,116 @@
console.info("[SOCIETY] dragontoothAxe.js loaded");
const Vec3 = Java.loadClass("net.minecraft.world.phys.Vec3");
const breakAxe = (item, server, player) => {
if (!player.stages.has("dragonslayer")) {
item.count--;
server.runCommandSilent(
`playsound minecraft:entity.warden.sonic_boom block @a ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, `{anchor:"BOTTOM_CENTER",background:1,wrap:220,align:"BOTTOM_CENTER",color:"#FF5555",offsetY:-60}`, 240, Text.translatable("item.society.dragontooth_axe.no_skill_broken").toJson())
);
}
};
const galaxySmashRadius = 3;
ItemEvents.firstLeftClicked((e) => {
const { hand, item, player, level, server } = e;
if (hand == "OFF_HAND") return;
if (hand == "MAIN_HAND" && item.id === "society:dragontooth_axe") {
breakAxe(item, server, player);
if (player.cooldowns.isOnCooldown(item) || !player.stages.has("galaxy_smash") || !player.isCrouching()) return;
for (let pos of BlockPos.betweenClosed(
new BlockPos(player.x - galaxySmashRadius, player.y - 1, player.z - galaxySmashRadius),
[player.x + galaxySmashRadius, player.y + 1, player.z + galaxySmashRadius]
)) {
if (pos.y === Math.round(player.y)) {
level.spawnParticles(
"supplementaries:bomb_smoke",
true,
pos.x,
pos.y + 0.5,
pos.z,
0.5 * rnd(0, 2),
0.1 * rnd(-1.25, 1),
0.5 * rnd(0, 2),
4,
0.01
);
}
}
let damageableMobs = level
.getEntitiesWithin(player.boundingBox.inflate(galaxySmashRadius + 0.5))
.filter((entity) => entity.isMonster());
let hammerDamage = player.potionEffects.isActive("minecraft:strength") ? 20 : 15;
damageableMobs.forEach((target) => {
target.isAttackable() && target.attack(hammerDamage);
level.spawnParticles(
"species:ichor",
true,
target.x,
target.y + 1.5,
target.z,
0.2 * rnd(1, 4),
0.1 * rnd(1, 4),
0.2 * rnd(1, 4),
5,
0.3
);
});
server.runCommandSilent(
`playsound quark:entity.toretoise.angry block @a ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(
`playsound minecraft:entity.ender_dragon.hurt block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, item, 200);
}
});
ItemEvents.rightClicked((e) => {
const { hand, item, player, level, server } = e;
if (hand == "OFF_HAND") return;
if (hand == "MAIN_HAND" && item.id === "society:dragontooth_axe") {
breakAxe(item, server, player);
if (player.cooldowns.isOnCooldown(item) || !player.stages.has("handleshot") || !player.isCrouching()) return;
let arrow = level
.getBlock(player.x, player.y + 1, player.z)
.createEntity("minecraft:arrow");
arrow.y = arrow.y + 1;
let speed = 5.0;
let motionX = player.lookAngle.x() * speed;
let motionY = player.lookAngle.y() * speed;
let motionZ = player.lookAngle.z() * speed;
arrow.setDeltaMovement(new Vec3(motionX, motionY, motionZ));
arrow.spawn();
level.spawnParticles(
"supplementaries:bomb_smoke",
true,
player.x,
player.y + 0.5,
player.z,
0.9 * rnd(0, 3),
0.1 * rnd(-1.25, 1),
0.9 * rnd(0, 3),
20,
0.01
);
server.runCommandSilent(
`playsound minecraft:entity.ghast.shoot block @a ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(
`playsound minecraft:entity.ender_dragon.hurt block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, item, 80);
}
});
BlockEvents.leftClicked((e) => {
const { hand, item, player, server } = e;
if (hand == "OFF_HAND") return;
if (hand == "MAIN_HAND" && item.id === "society:dragontooth_axe")
breakAxe(item, server, player);
});
@@ -0,0 +1,46 @@
console.info("[SOCIETY] experienceBooks.js loaded");
const addExperience = (player, server, item, type) => {
global.giveExperience(server, player, type, 1000);
server.runCommandSilent(
`playsound minecraft:block.enchantment_table.use block @a ${player.x} ${player.y} ${player.z}`
);
item.count--;
global.addItemCooldown(player, item, 2);
};
ItemEvents.rightClicked("society:yard_work_yearly", (e) => {
const { server, player, item } = e;
addExperience(player, server, item, "farming");
});
ItemEvents.rightClicked("society:husbandry_hourly", (e) => {
const { server, player, item } = e;
addExperience(player, server, item, "husbandry");
});
ItemEvents.rightClicked("society:mining_monthly", (e) => {
const { server, player, item } = e;
addExperience(player, server, item, "mining");
});
ItemEvents.rightClicked("society:combat_quarterly", (e) => {
const { server, player, item } = e;
addExperience(player, server, item, "adventuring");
});
ItemEvents.rightClicked("society:wet_weekly", (e) => {
const { server, player, item } = e;
addExperience(player, server, item, "fishing");
});
ItemEvents.rightClicked("society:book_of_stars", (e) => {
const { server, player, item } = e;
global.giveExperience(server, player, "farming", 750);
global.giveExperience(server, player, "husbandry", 750);
global.giveExperience(server, player, "mining", 750);
global.giveExperience(server, player, "adventuring", 750);
global.giveExperience(server, player, "fishing", 750);
server.runCommandSilent(
`playsound minecraft:block.enchantment_table.use block @a ${player.x} ${player.y} ${player.z}`
);
item.count--;
global.addItemCooldown(player, item, 2);
});
@@ -0,0 +1,17 @@
console.info("[SOCIETY] eyeOfEnderMessage.js loaded");
const eyeThrottle = ((temp) => (entity, tick, identifier) => {
const { age, uuid } = entity;
const key = `${uuid}${identifier}`;
const now = temp[key];
if (!now || age - now >= tick) {
temp[key] = age;
return false;
}
return true;
})({});
ItemEvents.rightClicked("minecraft:ender_eye", (e) => {
if (eyeThrottle(e.player, 400, "eye_throttle")) return;
e.player.tell(Text.translatable("society.ender_eye.no_end").red());
});
@@ -0,0 +1,30 @@
console.info("[SOCIETY] fishRadar.js loaded");
const renderItem = (id) => Item.of(id).displayName;
ItemEvents.rightClicked("society:fish_radar", (e) => {
const { level, player, item } = e;
function playerTell(x) {
player.tell(x);
}
player.tell(global.getSeasonFromBiome(level, player.pos))
let fish = [];
player.tell(
Text.of("=====[ ").gray()
.append(Text.translatable("item.society.fish_radar").green())
.append(" ]=====")
);
if (level.dimension !== "minecraft:the_nether") {
fish = global.overworldRadar(e, fish, playerTell, true);
} else {
fish = global.netherRadar(e, fish, playerTell);
}
if (player.stages.has("mystical_ocean")) fish.push("society:neptuna");
player.tell(Text.gray("======================"));
fish.forEach((fish) => {
player.tell(renderItem(fish));
});
global.addItemCooldown(player, item, 20);
});
@@ -0,0 +1,59 @@
console.info("[SOCIETY] geodeCracking.js loaded");
ItemEvents.rightClicked("society:geode_buster", e => {
const { player, server, item } = e
const geodeTypes = [
"society:geode",
"society:frozen_geode",
"society:magma_geode",
"society:omni_geode",
];
const geode = player.getHeldItem("off_hand").getId();
if (!geodeTypes.includes(geode)) return;
server.runCommandSilent(
`playsound minecraft:ui.stonecutter.take_result block @a ${player.x} ${player.y} ${player.z}`
);
const bonusOdds = geode === "society:omni_geode" ? 0.4 : 0.3;
const treasureOdds = geode === "society:omni_geode" ? 0.6 : 0.2;
const geodeJunk = Ingredient.of("#society:geode_junk").itemIds;
const geodeBonus = Ingredient.of(`#${geode}_bonus`).itemIds;
const geodeTreasure = Ingredient.of(`#${geode}_treasure`).itemIds;
let givenItem = false;
item.count--;
player.getHeldItem("off_hand").count--;
let reward = player.level.createEntity("minecraft:item");
reward.x = player.x;
reward.y = player.y;
reward.z = player.z;
const roll = Math.random();
if (roll <= 0.9) {
reward.item = geodeJunk[Math.floor(Math.random() * geodeJunk.length)];
if (geode === "society:omni_geode" && roll <= 0.03) reward.item = "society:prismatic_shard"
givenItem = true;
}
if (roll <= bonusOdds) {
reward.item = geodeBonus[Math.floor(Math.random() * geodeBonus.length)];
givenItem = true;
}
if (roll <= treasureOdds || !player.stages.has("first_geode")) {
reward.item = geodeTreasure[Math.floor(Math.random() * geodeTreasure.length)];
givenItem = true;
player.stages.add('first_geode')
}
if (!givenItem) {
server.runCommandSilent(
`playsound stardew_fishing:fish_escape block @a ${player.x} ${player.y} ${player.z}`
);
} else {
reward.spawn();
server.runCommandSilent(
`playsound stardew_fishing:complete block @a ${player.x} ${player.y} ${player.z}`
);
}
global.addItemCooldown(player, "society:geode_buster", 2);
});
@@ -0,0 +1,118 @@
console.info("[SOCIETY] lootOpening.js loaded");
ItemEvents.rightClicked("society:furniture_box", (e) => {
const { server, player, item } = e;
server.runCommandSilent(
`playsound minecraft:ui.stonecutter.take_result block @a ${player.x} ${player.y} ${player.z}`
);
const furniture = Ingredient.of("#society:loot_furniture").itemIds;
if (!player.isCreative()) item.count--;
let reward = player.level.createEntity("minecraft:item");
const rewardCount = player.stages.has("the_red_and_the_black") ? 2 : 1;
reward.x = player.x;
reward.y = player.y;
reward.z = player.z;
reward.item = Item.of(
`${rewardCount}x ${furniture[Math.floor(Math.random() * furniture.length)]}`
);
reward.spawn();
server.runCommandSilent(
`playsound stardew_fishing:complete block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, "society:furniture_box", 2);
});
const fantasyBoxes = [
"nordic",
"dunmer",
"venthyr",
"bone",
"royal",
"necrolord",
];
fantasyBoxes.forEach((theme) => {
ItemEvents.rightClicked(`society:fantasy_box_${theme}`, (e) => {
const { server, player, item } = e;
server.runCommandSilent(
`playsound minecraft:ui.stonecutter.take_result block @a ${player.x} ${player.y} ${player.z}`
);
let furniture = Ingredient.of(
`#society:${theme}_fantasy_furniture`
).itemIds;
furniture = furniture.concat(
Ingredient.of(`#society:decorations_fantasy_furniture`).itemIds
);
if (!player.isCreative()) item.count--;
let reward = player.level.createEntity("minecraft:item");
const rewardCount = player.stages.has("the_red_and_the_black") ? 2 : 1;
reward.x = player.x;
reward.y = player.y;
reward.z = player.z;
reward.item = Item.of(
`${rewardCount}x ${
furniture[Math.floor(Math.random() * furniture.length)]
}`
);
const itemId = reward.item.id;
if (itemId.includes("wool") || itemId.includes("carpet"))
reward.item = Item.of(`16x ${itemId}`);
if (itemId.includes("double")) reward.item = Item.of(`2x ${itemId}`);
reward.spawn();
server.runCommandSilent(
`playsound stardew_fishing:complete block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, `society:fantasy_box_${theme}`, 2);
});
});
ItemEvents.rightClicked("society:bouquet_bag", (e) => {
const { server, player, item } = e;
server.runCommandSilent(
`playsound minecraft:ui.stonecutter.take_result block @a ${player.x} ${player.y} ${player.z}`
);
const furniture = Ingredient.of("#society:bouquet_bag_flowers").itemIds;
if (!player.isCreative()) item.count--;
let reward = player.level.createEntity("minecraft:item");
const rewardCount = player.stages.has("the_red_and_the_black") ? 5 : 4;
reward.x = player.x;
reward.y = player.y;
reward.z = player.z;
reward.item = Item.of(
`${rewardCount}x ${furniture[Math.floor(Math.random() * furniture.length)]}`
);
reward.spawn();
server.runCommandSilent(
`playsound stardew_fishing:complete block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, "society:bouquet_bag", 2);
});
ItemEvents.rightClicked("society:scavenged_food_bag", (e) => {
const { server, player, item } = e;
server.runCommandSilent(
`playsound minecraft:ui.stonecutter.take_result block @a ${player.x} ${player.y} ${player.z}`
);
const furniture = Ingredient.of("#society:dish").itemIds;
if (!player.isCreative()) item.count--;
let reward = player.level.createEntity("minecraft:item");
const rewardCount = player.stages.has("the_red_and_the_black") ? 2 : 1;
reward.x = player.x;
reward.y = player.y;
reward.z = player.z;
reward.item = Item.of(
`${rewardCount}x ${furniture[Math.floor(Math.random() * furniture.length)]}`
);
reward.spawn();
server.runCommandSilent(
`playsound stardew_fishing:complete block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, "society:scavenged_food_bag", 2);
});
@@ -0,0 +1,141 @@
console.info("[SOCIETY] magicRope.js loaded");
const canTeleportDown = (level, player, blockPos) => {
let scannedBlock;
let airAbove = false;
let successBlock = 0;
for (let i = 5; i < 15; i++) {
scannedBlock = level.getBlock(blockPos.offset(0, -i, 0));
if (
["minecraft:air", "minecraft:cave_air", "minecraft:cave_vines_plant"].includes(
scannedBlock.id
)
) {
if (airAbove) {
successBlock = i;
} else airAbove = true;
} else if (airAbove) airAbove = false;
}
if (successBlock > 0) {
player.teleportTo(level, blockPos.x, blockPos.y - successBlock, blockPos.z, [], 0.0, 0.0);
return true;
}
return false;
};
const canTeleportSide = (level, player, blockPos) => {
let scannedBlock;
let successBlock;
let xOffset = 0;
let zOffset = 0;
if (player.facing == "north") zOffset = -1;
if (player.facing == "south") zOffset = 1;
if (player.facing == "east") xOffset = 1;
if (player.facing == "west") xOffset = -1;
for (let i = 5; i < 40; i++) {
scannedBlock = level.getBlock(blockPos.offset(i * xOffset, 0, i * zOffset));
if (scannedBlock) {
if (
["minecraft:air", "minecraft:cave_air", "minecraft:cave_vines_plant"].includes(
level.getBlock(scannedBlock.getPos().above()).id
)
) {
successBlock = scannedBlock.pos;
}
}
}
if (successBlock) {
player.teleportTo(level, successBlock.x, successBlock.y, successBlock.z, [], 0.0, 0.0);
return true;
}
return false;
};
ItemEvents.rightClicked("society:magic_rope", (e) => {
const { level, server, item, player } = e;
let errorText;
if (level.dimension !== "society:skull_cavern") {
errorText = Text.translatable("item.society.magic_rope.invalid_dimension");
} else {
if (canTeleportDown(level, player, player.onPos)) {
item.count--;
server.runCommandSilent(
`playsound minecraft:entity.enderman.teleport block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, item, 150);
} else errorText = Text.translatable("item.society.magic_rope.no_room_below");
}
if (errorText) {
global.addItemCooldown(player, item, 2);
global.renderUiText(
player,
server,
{
magicRopeMessage: {
type: "text",
x: 0,
y: -90,
text: `${errorText.toJson()}`,
color: "#FF5555",
alignX: "center",
alignY: "bottom",
},
magicRopeMessageShadow: {
type: "text",
x: 1,
z: -1,
y: -89,
text: `${errorText.toJson()}`,
color: "#000000",
alignX: "center",
alignY: "bottom",
},
},
global.mainUiElementIds
);
}
});
BlockEvents.rightClicked((e) => {
const { level, server, item, player, block } = e;
let errorText;
if (item.id == "society:magic_tunnel")
if (level.dimension !== "society:skull_cavern") {
errorText = Text.translatable("item.society.magic_rope.invalid_dimension");
} else {
if (canTeleportSide(level, player, block.pos)) {
item.count--;
server.runCommandSilent(
`playsound minecraft:entity.enderman.teleport block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, item, 150);
} else errorText = Text.translatable("item.society.magic_rope.no_room_side");
}
if (errorText) {
global.addItemCooldown(player, item, 2);
global.renderUiText(
player,
server,
{
magicRopeMessage: {
type: "text",
x: 0,
y: -90,
text: `${errorText.toJson()}`,
color: "#FF5555",
alignX: "center",
alignY: "bottom",
},
magicRopeMessageShadow: {
type: "text",
x: 1,
z: -1,
y: -89,
text: `${errorText.toJson()}`,
color: "#000000",
alignX: "center",
alignY: "bottom",
},
},
global.mainUiElementIds
);
}
});
@@ -0,0 +1,24 @@
console.info("[SOCIETY] overflowToken.js loaded");
ItemEvents.rightClicked("society:overflow_token", (e) => {
const { item, server, hand, player } = e;
if (hand == "OFF_HAND") return;
if (hand == "MAIN_HAND") {
let overflowList = server.persistentData.overflowList;
let playerUUID = player.getUuid();
if (overflowList == null) {
overflowList = {};
}
if (overflowList[playerUUID] == null) {
overflowList[playerUUID] = 1;
} else {
overflowList[playerUUID] += 1;
}
server.persistentData.overflowList = overflowList;
if (!player.isCreative()) item.shrink(1);
server.runCommandSilent(
`playsound tanukidecor:block.cash_register.ring block @a ${player.x} ${player.y} ${player.z}`
);
}
});
@@ -0,0 +1,35 @@
console.info("[SOCIETY] pawpawRoad.js loaded");
const pawpawThrottle = ((temp) => (entity, tick, identifier) => {
const { age, uuid } = entity;
const key = `${uuid}${identifier}`;
const now = temp[key];
if (!now || age - now >= tick) {
temp[key] = age;
return false;
}
return true;
})({});
ItemEvents.rightClicked("pamhc2trees:pawpawitem", (e) => {
if (pawpawThrottle(e.player, 1000, "pawpaw_throttle")) return;
if (Math.random() < 0.05) {
e.player.tell(Text.translatable("society.pawpaw_road.1").gold());
e.server.scheduleInTicks(60, () => {
e.player.tell(Text.translatable("society.pawpaw_road.2").gold());
});
e.server.scheduleInTicks(120, () => {
e.player.tell(Text.translatable("society.pawpaw_road.3").gold());
});
e.server.scheduleInTicks(180, () => {
e.player.tell(Text.translatable("society.pawpaw_road.4").gold());
});
e.server.scheduleInTicks(240, () => {
e.player.tell(Text.translatable("society.pawpaw_road.5").gold().bold());
});
e.server.scheduleInTicks(300, () => {
e.player.tell(Text.translatable("society.pawpaw_road.6").gold().bold());
});
}
});
@@ -0,0 +1,633 @@
console.info("[SOCIETY] pigRacing.js loaded");
const debugSpeeds = false;
const pigColors = ["Red", "Blue", "Yellow", "Green"];
const stashyHashy = (input) => {
let hash = 5;
for (let i = 0; i < input.length; i++) {
hash = (hash * 9) ^ input.codePointAt(i);
}
return Math.abs(Math.round(hash / 512));
};
const adjustment = (enabled) => (enabled ? 0.05 : 0);
const getSpeeds = (seed, level) => {
let speeds = [];
let hashNumber;
let boostFirstSprint = false;
let sleepyFirstSprint = false;
let boostSecondSprint = false;
let sleepySecondSprint = false;
pigColors.forEach((pig) => {
hashNumber = Math.abs(stashyHashy(global.getSeasonFromLevel(level) + pig) + seed);
boostFirstSprint = hashNumber % 3 === 0;
sleepyFirstSprint = hashNumber % 4 === 0;
boostSecondSprint = hashNumber % 5 === 0;
sleepySecondSprint = hashNumber % 6 === 0;
if (debugSpeeds) {
console.log(`${pig}: Boost: ${boostFirstSprint} - ${boostSecondSprint}`);
console.log(`${pig}: Sleepy: ${sleepyFirstSprint} - ${sleepySecondSprint}`);
}
speeds.push([
Math.random() * (1.2 + adjustment(boostFirstSprint) - (0.7 - adjustment(sleepyFirstSprint))) +
1,
Math.random() *
(1.2 + adjustment(boostSecondSprint) - (0.7 - adjustment(sleepySecondSprint))) +
1,
]);
});
return speeds;
};
const clearPigPaint = (player) => {
const pigElements = ["", "Change", "Trophy"];
let removedElements = {};
let id = "";
// Spawn and clear instance of paint element to prevent warnings that they don't exist
pigColors.forEach((pig) => {
pigElements.forEach((element) => {
id = `pig${pig}${element}`;
removedElements[id] = { type: "text" };
});
});
player.paint(removedElements);
pigColors.forEach((pig) => {
pigElements.forEach((element) => {
id = `pig${pig}${element}`;
removedElements[id] = { remove: true };
});
});
player.paint(removedElements);
};
const initialPaint = (player, bet, pig) => {
player.paint({
screen: {
type: "rectangle",
y: -50,
w: 268,
h: 256,
alignX: "center",
alignY: "bottom",
texture: "society:textures/gui/pig_racing/horse_racing_screen.png",
},
pigRed: {
type: "rectangle",
x: -110,
y: -170,
z: 20,
w: 32,
h: 32,
alignX: "center",
alignY: "bottom",
texture: "society:textures/gui/pig_racing/pig_red.png",
},
pigBlue: {
type: "rectangle",
x: -110,
y: -132,
z: 20,
w: 32,
h: 32,
alignX: "center",
alignY: "bottom",
texture: "society:textures/gui/pig_racing/pig_blue.png",
},
pigYellow: {
type: "rectangle",
x: -110,
y: -94,
z: 20,
w: 32,
h: 32,
alignX: "center",
alignY: "bottom",
texture: "society:textures/gui/pig_racing/pig_yellow.png",
},
pigGreen: {
type: "rectangle",
x: -110,
y: -54,
z: 20,
w: 32,
h: 32,
alignX: "center",
alignY: "bottom",
texture: "society:textures/gui/pig_racing/pig_green.png",
},
betCoin: {
type: "item",
item: bet.id,
x: -100,
y: -197,
h: 32,
w: 32,
alignX: "center",
alignY: "bottom",
},
betCount: {
type: "text",
text: `x${bet.count}`,
scale: 3,
color: "#000000",
x: -70,
y: -207,
alignX: "center",
alignY: "bottom",
},
betPig: {
type: "rectangle",
y: -212,
x: 112,
z: 20,
w: 32,
h: 32,
alignX: "center",
alignY: "bottom",
texture: `society:textures/gui/pig_racing/pig_${pig.toLowerCase()}.png`,
},
});
};
const getCountDownPaint = (count) => {
return {
type: "rectangle",
y: -70,
z: 10,
w: 128,
h: 128,
alignX: "center",
alignY: "bottom",
texture: `society:textures/gui/pig_racing/${count}.png`,
};
};
const countDown = (player, server) => {
const delayFactor = 7;
player.paint({
number: getCountDownPaint("3"),
});
server.scheduleInTicks(delayFactor, () => {
player.paint({
number: getCountDownPaint("2"),
});
});
server.scheduleInTicks(delayFactor * 2, () => {
player.paint({
number: getCountDownPaint("1"),
});
});
server.scheduleInTicks(delayFactor * 3, () => {
player.paint({
number: {
type: "rectangle",
y: -70,
z: 10,
w: 128,
h: 128,
alignX: "center",
alignY: "bottom",
texture: `society:textures/gui/pig_racing/go.png`,
},
});
});
server.scheduleInTicks(delayFactor * 4, () => {
player.paint({
number: { remove: true },
});
});
};
const paintPig = (player, server, xOffset, speeds, halfwayPoint, ranking) => {
const yOffsets = [-170, -132, -94, -54];
let pigElement = {};
const finishLine = 214;
let id = "";
let halfWay = 0;
let secondWindCalc = 0;
let secondWindChange = false;
let calculatedOffset = 0;
let raceCompleted = false;
pigColors.forEach((color, index) => {
id = `pig${color}`;
halfWay = speeds[index][0] * halfwayPoint;
secondWindCalc = halfWay + speeds[index][1] * (xOffset - halfwayPoint) + 1;
raceCompleted = secondWindCalc >= finishLine;
calculatedOffset =
speeds[index][0] * xOffset >= halfWay
? raceCompleted
? finishLine
: secondWindCalc
: speeds[index][0] * xOffset;
if (
Math.floor(speeds[index][0] * xOffset) === Math.floor(halfWay) &&
Math.abs(speeds[index][1] - speeds[index][0]) >= 0.1
) {
secondWindChange = speeds[index][1] > speeds[index][0];
server.runCommandSilent(
`playsound ${secondWindChange ? "trials:breeze_idle" : "trials:spawner_summon"} player @a ${
player.x
} ${player.y} ${player.z}`
);
pigElement[`${id}Change`] = {
type: "rectangle",
color: "#FFFFFF",
z: 12,
x: -110 + halfWay,
y: yOffsets[index] - 8,
alignX: "center",
alignY: "bottom",
texture: `society:textures/gui/pig_racing/${secondWindChange ? "boost" : "sleepy"}.png`,
};
}
pigElement[id] = { remove: true };
player.paint(pigElement);
pigElement[id] = {
type: "rectangle",
x: -110 + calculatedOffset,
y: yOffsets[index],
z: 11,
w: 32,
h: 32,
alignX: "center",
alignY: "bottom",
texture: `society:textures/gui/pig_racing/pig_${color.toLowerCase()}.png`,
};
if (raceCompleted) {
!ranking.includes(color) && ranking.push(color);
pigElement[`${id}Trophy`] = {
type: "rectangle",
y: yOffsets[index],
x: finishLine - 130 - 16,
z: 10,
w: 32,
h: 32,
alignX: "center",
alignY: "bottom",
texture: `society:textures/gui/pig_racing/trophy_${ranking.indexOf(color) + 1}.png`,
};
}
player.paint(pigElement);
});
};
const handleSPResults = (player, server, betPig, betItem, ranking) => {
let newItem = betItem;
newItem.count = betItem.count * 2;
const wonRace = ranking[0] === betPig;
if (wonRace) {
player.give(Item.of(newItem));
server.runCommandSilent(
`playsound advancementplaques:ui.toast.goal_complete player @a ${player.x} ${player.y} ${player.z}`
);
} else {
server.runCommandSilent(
`playsound stardew_fishing:fish_escape player @a ${player.x} ${player.y} ${player.z}`
);
}
player.paint({
result: {
type: "rectangle",
y: -70,
z: 20,
w: 128,
h: 128,
alignX: "center",
alignY: "bottom",
texture: `society:textures/gui/pig_racing/${wonRace ? "win" : "lost"}.png`,
},
});
};
const handleMPResults = (player, server, betPig, betValue, poolValue, ranking) => {
const wonRace = ranking[0] === betPig;
let prizePoolCoins = 0;
ranking.forEach((rank, index) => {
if (rank === betPig) {
if (index === 0) {
prizePoolCoins = global.calculateCoinsFromValue(Math.min(poolValue, betValue * 2), []);
prizePoolCoins.forEach((coin) => {
player.give(Item.of(`${coin.count}x ${coin.id}`));
});
server.tell(
Text.translatable(
"society.pig_race.multiplay.result",
":first_place_medal:",
Text.gold(player.username),
Text.gold(global.formatPrice(Math.min(poolValue, betValue * 2))),
global.getPigColoredName(betPig)
).gray()
);
}
if (index === 1) {
prizePoolCoins = global.calculateCoinsFromValue(betValue, []);
prizePoolCoins.forEach((coin) => {
player.give(Item.of(`${Math.floor(coin.count)}x ${coin.id}`));
});
server.tell(
Text.translatable(
"society.pig_race.multiplay.result",
":second_place_medal:",
Text.gold(player.username),
Text.gold(global.formatPrice(Math.min(poolValue, betValue))),
global.getPigColoredName(betPig)
).gray()
);
}
if (index === 2) {
prizePoolCoins = global.calculateCoinsFromValue(betValue / 2, []);
prizePoolCoins.forEach((coin) => {
player.give(Item.of(`${Math.floor(coin.count)}x ${coin.id}`));
});
server.tell(
Text.translatable(
"society.pig_race.multiplay.result",
":third_place_medal:",
Text.gold(player.username),
Text.gold(global.formatPrice(Math.min(poolValue, betValue / 2))),
global.getPigColoredName(betPig)
).gray()
);
}
}
});
if (wonRace) {
server.runCommandSilent(
`playsound advancementplaques:ui.toast.goal_complete player @a ${player.x} ${player.y} ${player.z}`
);
} else {
server.runCommandSilent(
`playsound stardew_fishing:fish_escape player @a ${player.x} ${player.y} ${player.z}`
);
}
player.paint({
result: {
type: "rectangle",
y: -70,
z: 20,
w: 128,
h: 128,
alignX: "center",
alignY: "bottom",
texture: `society:textures/gui/pig_racing/${wonRace ? "win" : "lost"}.png`,
},
});
};
const resetMP = (server) => {
server.persistentData.bets = [];
server.persistentData.pigraceInProgress = false;
};
const runPigRace = (player, server, bet, betPig, ranking, pigSpeeds) => {
global.addItemCooldown(player, "society:pig_race_ticket", 350);
server.scheduleInTicks(0, () => {
server.runCommandSilent(`stopsound ${player.username}`);
server.runCommandSilent(
`playsound society:blazing_drift_fever_ex music ${player.username} ${player.x} ${player.y} ${player.z}`
);
initialPaint(player, bet, betPig);
countDown(player, server);
server.scheduleInTicks(25, () => {
const halfwayPoint = Math.floor(rnd(40, 120));
let i = 0;
let k = 0;
do {
player.server.scheduleInTicks(i, () => {
paintPig(player, server, k, pigSpeeds, halfwayPoint, ranking);
k++;
});
i++;
} while (i < 220);
});
server.scheduleInTicks(300 + 20, () => {
server.runCommandSilent(`stopsound ${player.username}`);
clearPigPaint(player);
player.paint({
screen: { remove: true },
betCoin: { remove: true },
betCount: { remove: true },
betPig: { remove: true },
result: { remove: true },
});
});
});
};
const validTicket = (e, bet) => {
const { player, server, item } = e;
const coins = [
"numismatics:crown",
"numismatics:sun",
"numismatics:neptunium_coin",
"numismatics:ancient_coin",
"numismatics:prismatic_coin",
];
if (!coins.includes(bet.id)) {
server.runCommandSilent(
global.getEmbersTextAPICommand(
player.username,
`{anchor:"BOTTOM_CENTER",background:1,align:"BOTTOM_CENTER",color:"#FFFFFFF",offsetY:-60}`,
80,
Text.translatable("society.pig_race.need_coin").toJson()
)
);
return false;
}
if (!item.nbt) {
server.runCommandSilent(
global.getEmbersTextAPICommand(
player.username,
`{anchor:"BOTTOM_CENTER",background:1,align:"BOTTOM_CENTER",color:"#FFFFFFF",offsetY:-60}`,
80,
Text.translatable("society.pig_race.need_to_select_pig").toJson()
)
);
return false;
}
return true;
};
ItemEvents.rightClicked("society:pig_race_ticket", (e) => {
const { player, server, item, level } = e;
const pigSpeeds = getSpeeds(server.worldData.worldGenOptions().seed(), level);
const bet = player.offHandItem;
let betPig;
let ranking = [];
if (!validTicket(e, bet)) return;
item.count--;
player.offHandItem = "minecraft:air";
betPig = item.nbt.bet;
runPigRace(player, server, bet, betPig, ranking, pigSpeeds);
server.scheduleInTicks(210 + 40, () => {
handleSPResults(player, server, betPig, bet, ranking);
});
});
ItemEvents.rightClicked("society:multiplayer_pig_race_ticket", (e) => {
const { player, server, item, level } = e;
const pigSpeeds = getSpeeds(server.worldData.worldGenOptions().seed(), level);
const bettingPeriod = 20 * 60 * 2;
const bet = player.offHandItem;
let raceData = server.persistentData;
let betValue;
let betPig;
let ranking = [];
let players = [];
let prizePool = 0;
if (raceData.pigraceInProgress) {
server.runCommandSilent(
global.getEmbersTextAPICommand(
player.username,
`{anchor:"BOTTOM_CENTER",background:1,align:"BOTTOM_CENTER",color:"#FFFFFFF",offsetY:-60}`,
80,
Text.translatable("society.pig_race.multiplay.in_progress").toJson()
)
);
return;
}
if (!validTicket(e, bet)) return;
resetMP(server);
item.count--;
player.offHandItem = "minecraft:air";
betValue = betValue = global.calculateCoinValue(bet);
betPig = item.nbt.bet;
server.tell(
Text.translatable(
"society.pig_race.multiplay.start",
Text.gold(player.username),
Text.gold(global.formatPrice(betValue)),
global.getPigColoredName(betPig)
)
);
raceData.pigraceInProgress = true;
raceData.ageRaceStarted = server.getTickCount();
raceData.bets = [];
raceData.bets.push({
player: player.username,
bet: betValue,
betPig: betPig,
});
server.scheduleInTicks(0, () => {
server.scheduleInTicks(bettingPeriod / 2, () => {
server.tell(
Text.translatable(
"society.pig_race.multiplay.start_in_minute",
`${bettingPeriod / (2 * 20 * 60)}`
).gray()
);
});
server.scheduleInTicks(bettingPeriod - 10 * 20, () => {
server.tell(Text.translatable("society.pig_race.multiplay.start_in_10").gray());
});
server.scheduleInTicks(bettingPeriod, () => {
raceData = server.persistentData;
if (raceData.bets.length > 1) {
raceData.pigraceInProgress = false;
for (let index = 0; index < raceData.bets.length; index++) {
prizePool += raceData.bets[index].bet;
}
level.getServer().players.forEach((p) => {
for (let index = 0; index < raceData.bets.length; index++) {
if (String(p.username) === String(raceData.bets[index].player)) {
players.push(p);
runPigRace(
p,
server,
global.calculateCoinsFromValue(prizePool, [])[0],
String(raceData.bets[index].betPig),
ranking,
pigSpeeds
);
}
}
});
server.tell(
Text.translatable(
"society.pig_race.multiplay.started",
`${global.formatPrice(prizePool)}`
).gray()
);
} else {
player.give(bet);
player.give(Item.of("society:multiplayer_pig_race_ticket"));
server.tell(Text.translatable("society.pig_race.multiplay.cancelled").gray());
clearPigPaint(player);
resetMP(server);
}
});
server.scheduleInTicks(210 + 40 + bettingPeriod, () => {
level.getServer().players.forEach((p) => {
for (let index = 0; index < raceData.bets.length; index++) {
if (String(p.username) === String(raceData.bets[index].player)) {
handleMPResults(
p,
server,
String(raceData.bets[index].betPig),
Number(raceData.bets[index].bet),
prizePool,
ranking
);
clearPigPaint(player);
}
}
});
resetMP(server);
});
});
});
ItemEvents.firstLeftClicked(
["society:pig_race_ticket", "society:multiplayer_pig_race_ticket"],
(e) => {
const { item, server, player } = e;
server.runCommandSilent(
`playsound refurbished_furniture:ui.paddle_ball.retro_click block @a ${player.x} ${player.y} ${player.z}`
);
let newNbt = item.getNbt() || { bet: 0 };
const betIndex = pigColors.indexOf(newNbt.bet);
const betPig = pigColors[betIndex === 3 ? 0 : betIndex + 1];
newNbt.bet = betPig;
item.nbt = newNbt;
const pigSelectedText = Text.translatable("society.pig_race.pig_selected", global.getPigColoredName(betPig));
const pigSelectedTextShadow = Text.translatable("society.pig_race.pig_selected", betPig).noColor();
global.renderUiText(
player,
server,
{
pigBet: {
type: "text",
x: 0,
y: -90,
text: `${pigSelectedText.toJson()}`,
color: "#AAAAAA",
alignX: "center",
alignY: "bottom",
},
pigBetShadow: {
type: "text",
x: 1,
z: -1,
y: -89,
text: `${pigSelectedTextShadow.toJson()}`,
color: "#000000",
alignX: "center",
alignY: "bottom",
},
},
["pigBet"]
);
global.addItemCooldown(player, item, 10);
}
);
@@ -0,0 +1,38 @@
console.info("[SOCIETY] plushieCapsule.js loaded");
ItemEvents.rightClicked("society:plushie_capsule", (e) => {
const { server, player, item } = e;
server.runCommandSilent(
`playsound minecraft:ui.stonecutter.take_result block @a ${player.x} ${player.y} ${player.z}`
);
const plushies = Ingredient.of("#society:plushies").itemIds;
if (!player.isCreative()) item.count--;
let red = player.stages.has("the_red_and_the_black");
let women = player.stages.has("women_who_run_with_the_plushies");
const drop = plushies[Math.floor(Math.random() * plushies.length)];
let reward = player.level.createEntity("minecraft:item");
let quality = 0;
const qualityRoll = Math.random();
const type = Number(rnd(0, 14));
const quest = Number(rnd(1, 3));
const gatchaRarity = women ? [0.25, 0.6, 0.3, 0.1] : [0.5, 0.3, 0.15, 0.05];
gatchaRarity.forEach((rarity, index) => {
if (qualityRoll < rarity) quality = index;
});
reward.x = player.x;
reward.y = player.y;
reward.z = player.z;
reward.item = Item.of(
`${red ? 2 : 1}x ${drop}`,
`{quality_food:{quality:${quality}},type:${type},quest_id:${quest},affection:${
women ? 2 : 0
}}`
);
reward.spawn();
server.runCommandSilent(
`playsound stardew_fishing:complete block @a ${player.x} ${player.y} ${player.z}`
);
global.addItemCooldown(player, "society:plushie_capsule", 2);
});
@@ -0,0 +1,7 @@
console.info("[SOCIETY] plushieDebug.js loaded");
ItemEvents.entityInteracted('etcetera:wrench', (e) => {
global.plushieTraits.forEach((trait, index) => {
e.player.give(Item.of('perfectplushies:adv_duck_plushie', `{affection:4,animal:{type:"${e.target.type}"},quality_food:{quality:3},quest_id:1,type:${index}}`))
})
});
@@ -0,0 +1,66 @@
console.info("[SOCIETY] regretCrystals.js loaded");
const resetSkills = (tree, server, player, amount) => {
server.runCommandSilent(
`playsound stardew_fishing:fish_escape block @a ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(`puffish_skills category erase ${player.username} society:${tree}`);
server.runCommandSilent(`puffish_skills points set ${player.username} society:${tree} 0`);
global.giveExperience(server, player, tree, amount, true);
player.tell(
Text.translatable(
"society.crystal_of_regret.success",
global.translatableWithFallback(`society_skills.${tree}.category.title`, `${tree}`)
).gray()
);
};
ItemEvents.rightClicked("society:crystal_of_regret_farming", (e) => {
const { player, item, server } = e;
if (player.stages.has("soil_inspector") || player.stages.has("sticky_crops")) {
resetSkills("farming", server, player, 15500);
item.count--;
} else {
player.tell(Text.translatable("society.crystal_of_regret.fail").red());
}
});
ItemEvents.rightClicked("society:crystal_of_regret_husbandry", (e) => {
const { player, item, server } = e;
if (player.stages.has("animal_whisperer") || player.stages.has("bribery")) {
resetSkills("husbandry", server, player, 14500);
item.count--;
} else {
player.tell(Text.translatable("society.crystal_of_regret.fail").red());
}
});
ItemEvents.rightClicked("society:crystal_of_regret_mining", (e) => {
const { player, item, server } = e;
if (player.stages.has("furniture_archaeologist") || player.stages.has("blockchain")) {
resetSkills("mining", server, player, 8750);
item.count--;
} else {
player.tell(Text.translatable("society.crystal_of_regret.fail").red());
}
});
ItemEvents.rightClicked("society:crystal_of_regret_fishing", (e) => {
const { player, item, server } = e;
if (player.stages.has("mystical_ocean")) {
resetSkills("fishing", server, player, 14500);
item.count--;
} else {
player.tell(Text.translatable("society.crystal_of_regret.fail").red());
}
});
ItemEvents.rightClicked("society:crystal_of_regret_adventuring", (e) => {
const { player, item, server } = e;
if (player.stages.has("fence") || player.stages.has("dragonslayer")) {
resetSkills("adventuring", server, player, 8750);
item.count--;
} else {
player.tell(Text.translatable("society.crystal_of_regret.fail").red());
}
});
@@ -0,0 +1,48 @@
console.info("[SOCIETY] skillBooks.js loaded");
[
{ id: "society:alias_moss", skillId: "b2zbjhxyrcwlwb9e" },
{ id: "society:animal_fancy", skillId: "dk83vl5zi9fw3ovi" },
{ id: "society:banana_karenina", skillId: "76yv8nz8x47d80oe" },
{ id: "society:brine_and_punishment", skillId: "p5dklukq9ggwgfa4" },
{ id: "society:bluegill_meridian", skillId: "9ax835fydbyuvjkx" },
{ id: "society:bullfish_jobs", skillId: "pirgo25ykt4bsbdo" },
{ id: "society:canadian_and_famous", skillId: "x52wa6t39ywp17zu" },
{ id: "society:first_aid_guide", skillId: "12wl5sjx8vy7q0xl" },
{ id: "society:hitting_hard_and_soft", skillId: "t07mtr3euiz40jb0" },
{ id: "society:no_name_for_the_sheep", skillId: "uzxujhppzlyg5d03" },
{ id: "society:intro_to_algorithms", skillId: "gv808dy0r2fo6ire" },
{ id: "society:paradise_crop", skillId: "3grtavzaxp3xbp67" },
{ id: "society:slouching_towards_artistry", skillId: "pitrguemps2735n3" },
{ id: "society:debt_caverns", skillId: "bh5306iiysq2692k" },
{ id: "society:frogs_bounty_bazaar", skillId: "3fgcne477ni1rjxx" },
{ id: "society:phenomenology_of_treasure", skillId: "z68vn1cf2lucfbos" },
{ id: "society:slime_contain_protect", skillId: "uj8tnf4jgm0xyp13" },
{ id: "society:the_spark_also_rises", skillId: "n3wgu1edjjl2t511" },
{ id: "society:universal_methods_of_farming", skillId: "dm3efjm3y57v34ir" },
{ id: "society:wuthering_logs", skillId: "y1xltbgkupmcoe0i" },
{ id: "society:pond_house_five", skillId: "ajxn495vvckv1pow" },
{ id: "society:the_quality_of_the_earth", skillId: "y99a5jkv7tmu7vmc" },
{ id: "society:the_red_and_the_black", skillId: "ysthrzir822oedus" },
{ id: "society:women_who_run_with_the_plushies", skillId: "2vo8noqvq4aj1egy" },
{ id: "society:the_metamorphosize", skillId: "gjvl3ej2fhc4cwzb" },
].forEach((book) => {
ItemEvents.rightClicked(book.id, (e) => {
const { player, item, server } = e;
const stageName = String(item.id).path;
if (!player.stages.has(stageName)) {
server.runCommandSilent(
`puffish_skills skills unlock ${player.username} society:books ${book.skillId}`
);
player.tell(Text.translatable("society.skill_book.learn").green());
server.runCommandSilent(
`playsound minecraft:block.enchantment_table.use block @a ${player.x} ${player.y} ${player.z}`
);
item.count--;
global.addItemCooldown(player, item, 20);
} else {
player.tell(Text.translatable("society.skill_book.already_learn").red());
global.addItemCooldown(player, item, 20);
}
});
});
@@ -0,0 +1,146 @@
console.info("[SOCIETY] smokeTubasmokeStick.js loaded");
const endlessEntranaTemplate =
'{anchor:"BOTTOM_CENTER",background:1,wrap:220,align:"BOTTOM_CENTER",color:"#00AAAA",offsetY:-60}';
ItemEvents.rightClicked("society:tubasmoke_stick", (e) => {
const { server, player, item, hand, level } = e;
player.damageHeldItem(hand, 1);
server.runCommandSilent(
`playsound minecraft:item.flintandsteel.use block @a ${player.x} ${player.y} ${player.z}`
);
item.count--;
level.spawnParticles(
"farmersdelight:steam",
true,
player.x,
player.y + 1,
player.z,
0.1 * rnd(1, 6),
0.1 * rnd(1, 4),
0.1 * rnd(1, 4),
22,
0.001
);
server.runCommandSilent(
`playsound supplementaries:block.cannon.ignite block @a ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(`effect give ${player.username} minecraft:slowness 20 1`);
if (Math.random() < 0.02) {
server.runCommandSilent(
`execute in ${level.dimension} run summon lightning_bolt ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, `{anchor:"BOTTOM_CENTER",charShakeRandom:0.2,background:1,wrap:220,align:"BOTTOM_CENTER",color:"#FF5555",offsetY:-60}`, 60, Text.translatable("society.endless_entrana.text.0").toJson())
);
}
if (Math.random() < 0.01 && !item.nbt) {
server.runCommandSilent(
`playsound tanukidecor:block.cash_register.ring block @a ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.1").toJson())
);
server.scheduleInTicks(1, () => {
player.give(
Item.of(
"society:tubasmoke_stick",
`{edition:1,display:{Name:'${Text.translatable("society.endless_entrana", Text.of("1").bold()).bold().italic(false).toJson()}'}}`
)
);
});
}
if (item.nbt && item.nbt.edition) {
let giveNew = true;
if (item.nbt.edition === 500)
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.2").toJson())
);
if (item.nbt.edition === 650) {
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.3").toJson())
);
}
if (item.nbt.edition === 666) {
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.4").toJson())
);
server.scheduleInTicks(100, () => {
server.runCommandSilent(`kill ${player.username}`);
});
}
if (item.nbt.edition === 999) {
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 1200, Text.translatable("society.endless_entrana.text.5").toJson())
);
server.scheduleInTicks(648000, () => {
server.runCommandSilent(`kill ${player.username}`);
});
}
if (item.nbt.edition === 2000) {
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.6").toJson())
);
}
if (item.nbt.edition === 2100) {
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.7").toJson())
);
}
if (item.nbt.edition === 5000) {
player.give("numismatics:spur");
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.8").toJson())
);
}
if (item.nbt.edition > 10000 && Math.random() < 0.001) {
player.give("numismatics:bevel");
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.9").toJson())
);
}
if (item.nbt.edition > 10000 && Math.random() < 0.001) {
player.give("numismatics:sprocket");
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.9").toJson())
);
}
if (item.nbt.edition > 1000000000 && Math.random() < 0.0001) {
if (player.offHandItem === "numismatics:prismatic_coin") {
player.give("create:creative_blaze_cake");
player.offHandItem.count--;
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.11").toJson())
);
giveNew = false;
} else {
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, endlessEntranaTemplate, 120, Text.translatable("society.endless_entrana.text.10").toJson())
);
}
}
if (giveNew) {
server.scheduleInTicks(1, () => {
player.give(
Item.of(
"society:tubasmoke_stick",
`{edition:${item.nbt.edition + 1},display:{Name:'${Text.translatable("society.endless_entrana", Text.of((item.nbt.edition + 1).toFixed()).bold()).bold().italic(false).toJson()}'}}`
)
);
});
}
}
if (Math.random() < 0.01) {
server.scheduleInTicks(800, () => {
server.runCommandSilent(`effect give ${player.username} minecraft:wither 40 3`);
server.runCommandSilent(
global.getEmbersTextAPICommand(player.username, `{anchor:"BOTTOM_CENTER",charShakeRandom:0.2,background:1,wrap:220,align:"BOTTOM_CENTER",color:"#FF5555",offsetY:-60}`, 60, Text.translatable("society.endless_entrana.text.0").toJson())
);
});
}
global.addItemCooldown(player, item, 10);
});
@@ -0,0 +1 @@
// REMOVED
@@ -0,0 +1,83 @@
console.info("[SOCIETY] totems.js loaded");
const isEdging = (pos, x, z, radius) =>
pos.x === x + radius ||
pos.x === x - radius ||
pos.z === z + radius ||
pos.z === z - radius;
const runSpotTotem = (e, type) => {
const { server, player, level, item } = e;
const block = player.getOnPos();
const { x, y, z } = level.getBlock(block);
let radius = 2;
let scanBlock;
let aboveBlock;
for (let pos of BlockPos.betweenClosed(
new BlockPos(x - radius, y - 1, z - radius),
[x + radius, y + 1, z + radius]
)) {
if (isEdging(pos, x, z, radius)) {
if (!level.isLoaded(pos)) continue;
scanBlock = level.getBlock(pos);
aboveBlock = level.getBlock(pos.above());
if (
aboveBlock.id == "minecraft:air" &&
((type.equals("digspot") &&
scanBlock.hasTag("society:treasure_spot_spawns")) ||
(type.equals("fishingspot") &&
scanBlock.id.equals("minecraft:water")))
) {
server.runCommandSilent(
`execute as ${player.username} run littlejoys ${type} ${aboveBlock.x} ${aboveBlock.y} ${aboveBlock.z}`
);
}
}
}
server.runCommandSilent(
`playsound botania:terrasteel_craft block @a ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(
`playsound stardew_fishing:complete block @a ${player.x} ${player.y} ${player.z}`
);
if (!player.isCreative()) item.count--;
global.addItemCooldown(player, item.id, 20);
};
ItemEvents.rightClicked("society:treasure_totem", (e) => {
runSpotTotem(e, "digspot");
});
ItemEvents.rightClicked("society:bubble_totem", (e) => {
runSpotTotem(e, "fishingspot");
});
const runWeatherTotem = (e, weather) => {
const { server, player, item } = e;
server.runCommandSilent(
`weather ${weather}`
);
server.runCommandSilent(
`playsound botania:terrasteel_craft block @a ${player.x} ${player.y} ${player.z}`
);
server.runCommandSilent(
`playsound stardew_fishing:complete block @a ${player.x} ${player.y} ${player.z}`
);
if (!player.isCreative()) item.count--;
global.addItemCooldown(player, item.id, 2000);
};
ItemEvents.rightClicked("society:dry_totem", (e) => {
runWeatherTotem(e, "clear");
});
ItemEvents.rightClicked("society:rain_totem", (e) => {
runWeatherTotem(e, "rain");
});
ItemEvents.rightClicked("society:thunder_totem", (e) => {
runWeatherTotem(e, "thunder");
});
@@ -0,0 +1,131 @@
console.info("[SOCIETY] validateFishPondQuests.js loaded");
const multiplierToNatural = (mult) => {
switch (mult) {
case "shippingbin:meat_sell_multiplier":
return "Adventurer";
case "shippingbin:crop_sell_multiplier":
return "Farmer";
case "shippingbin:wood_sell_multiplier":
return "Artisan";
case "shippingbin:gem_sell_multiplier":
return "Geologist";
}
};
// Tests if quest items are valid items. Dev use only.
ItemEvents.rightClicked("functionalstorage:creative_vending_upgrade", (e) => {
const { player } = e;
let generatePriceWikiTable = false;
let generatePondTable = false;
let generatePrizeMachineTable = true;
player.server.persistentData.pigraceInProgress = false;
global.fishPondDefinitions.forEach((fish) => {
fish.quests.forEach((quest) => {
quest.requestedItems.forEach((req) => {
if (Item.of(req.item).id === "minecraft:air") player.tell(req.item);
});
});
});
if (generatePrizeMachineTable) {
player.tell(`{| class="wikitable sortable"`);
player.tell("|-");
player.tell(
`!Prize # !! Hint !! Possible Items`
);
player.tell("|-");
global.prizeMachineRewards.forEach((element, index) => {
player.tell(`|`);
player.tell(index);
player.tell(" || ")
player.tell(element.hint);
player.tell(" || ")
element.possibleOutputs.forEach((output) => {
let request = Item.of(output)
player.tell("* " + request.count);
player.tell(request.displayName);
});
player.tell("|-");
});
}
if (generatePriceWikiTable) {
// player.tell("Quests validated.");
// player.tell(`{| class="wikitable sortable"`);
// player.tell("|-");
// player.tell("! Name !! ID !! Price !! Type");
// player.tell("|-");
// Array.from(global.trades.keys()).forEach((element) => {
// let tradeData = global.trades.get(element);
// if (!element.includes("splendid_slimes"))
// player.tell(Item.of(element).displayName);
// else {
// let type = element.substring(element.lastIndexOf(":") + 1);
// if (element.includes("plort")) {
// player.tell(`Plort: ${type} `);
// } else {
// player.tell(`Slime Heart: ${type}`);
// }
// }
// player.tell(
// ` || ${
// element.includes("plort")
// ? "splendid_slimes:plort"
// : element.includes("slime_heart")
// ? "splendid_slimes:slime_heart"
// : element
// } || ${tradeData.value} || ${multiplierToNatural(tradeData.multiplier)}`
// );
// player.tell("|-");
// });
}
if (generatePondTable) {
// player.tell("Quests validated.");
// player.tell(`{| class="wikitable sortable"`);
// player.tell("|-");
// player.tell(
// `!Fish !! Population 3 !! Population 5 !! Population 7`
// );
// player.tell("|-");
// Array.from(global.fishPondDefinitions.keys()).forEach((element) => {
// let quests = global.fishPondDefinitions.get(element).quests;
// player.tell(`|`);
// player.tell(Item.of(element).displayName);
// player.tell(" || ")
// quests.forEach((quest) => {
// quest.requestedItems.forEach((request, index) => {
// player.tell("* " + request.count);
// player.tell(Item.of(request.item).displayName);
// });
// player.tell(" || ");
// });
// player.tell("|-");
// });
// IDK WHY I COMMENTED THE ABOVE NOW
// player.tell("Quests validated.");
// player.tell(`{| class="wikitable sortable"`);
// player.tell("|-");
// player.tell(`!Fish !! Items !! Min Population !! % chance`);
// player.tell("|-");
// Array.from(global.fishPondDefinitions.keys()).forEach((element) => {
// let rewards = global.fishPondDefinitions.get(element).additionalRewards;
// player.tell(`|rowspan="${rewards ? rewards.length : 1}"|`);
// player.tell(Item.of(element).displayName);
// if (rewards) {
// rewards.forEach((reward, index) => {
// player.tell("| " + reward.count);
// player.tell(Item.of(reward.item).displayName);
// player.tell("| " + reward.minPopulation);
// player.tell(`| ${Math.round(reward.chance * 100)}%`);
// player.tell("|- ");
// });
// } else {
// player.tell("|")
// player.tell("|")
// player.tell("|")
// player.tell("|-")
// }
// });
}
});