0% found this document useful (0 votes)
25 views8 pages

BloodMoon ModPE Api Code

The BloodMoon mod for ModPE 0.14.3 triggers a special event during specific world times, enhancing hostile mobs and applying various gameplay changes. It includes features such as increased mob health and damage, removal of beds, and ominous sound effects. The mod also provides debugging options and requires users to back up their worlds before extensive testing.

Uploaded by

aghniyacemara
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
25 views8 pages

BloodMoon ModPE Api Code

The BloodMoon mod for ModPE 0.14.3 triggers a special event during specific world times, enhancing hostile mobs and applying various gameplay changes. It includes features such as increased mob health and damage, removal of beds, and ominous sound effects. The mod also provides debugging options and requires users to back up their worlds before extensive testing.

Uploaded by

aghniyacemara
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

// BloodMoon (Easter Egg) — ModPE 0.14.

3 (safety-first, silent mode)


// - Trigger by world time (default 18000..23000) => enhanced hostile mobs,
darkness overlay,
// forced difficulty hard, beds clicked during event are temporarily removed and
restored after.
// - Minimal chat; uses sounds if available. Debug mode emits console/chat
messages.
// - IMPORTANT: keep backup of world before heavy tests.

var BM = (function(){
// CONFIG
var T_START = 18000; // inclusive (3 AM)
var T_END = 23000; // exclusive (6 AM)
var DAMAGE_MULT = 2.0; // multiplier for damage dealt by hostile mobs
var HP_MULT = 2.5; // multiplier for mob health
var SPEED_MULT = 1.8; // applied as extra chase velocity factor
var SOUND_INTERVAL_TICKS = 200; // periodical ominous sound when event active
var MAX_ENTITY_SCAN = 256; // safety cap
var DEBUG = false; // set true to get messages; use /bn_debug on

// STATE
var active = false;
var savedDifficulty = null;
var removedBeds = {}; // map key "x:y:z" => {x,y,z,blockId,data,removedByTick}
var registeredSpawnBeds = {}; // map entityId -> "x:y:z" when player slept
(registered)
var lastSoundTick = 0;
var tickCounter = 0;

// Helper: safe console and optional chat (debug)


function dlog(s){ try{ print("[BloodMoon] " + s); } catch(e){} if (DEBUG)
try{ clientMessage("[BloodMoon] " + s); } catch(e){} }
function playSoundAt(x,y,z, soundName, vol, pitch){
try { if (typeof [Link] === "function") { [Link](x,y,z,
soundName, vol||1, pitch||1); return true; } } catch(e){}
try { if (typeof [Link] === "function")
{ [Link](x,y,z, soundName, vol||1, pitch||1); return true; } } catch(e)
{}
// if not available, silent fallback
dlog("playSound not available or failed: " + soundName);
return false;
}

// entity helpers (best-effort)


function getAllEntities(){
try { if (typeof [Link] === "function") return
[Link]().slice(0, MAX_ENTITY_SCAN); } catch(e){}
return [];
}
function getEntityName(id){
try { if (typeof [Link] === "function") return
[Link](id); } catch(e){}
try { if (typeof [Link] === "function") return
[Link](id); } catch(e){}
return ""+id;
}
function isHostileByNameLower(n){
if (!n) return false;
n = [Link]();
// broad matching keywords for common hostile mobs in old MCPE era
return ([Link]("zombie")!==-1 ||
[Link]("skeleton")!==-1 ||
[Link]("creeper")!==-1 ||
[Link]("spider")!==-1 ||
[Link]("witch")!==-1 ||
[Link]("enderman")!==-1 ||
[Link]("silverfish")!==-1 ||
[Link]("ghast")!==-1 ||
[Link]("blaze")!==-1 ||
[Link]("slime")!==-1);
}

// attempts to set entity health to boosted value


function ensureBoostHealth(eid){
try {
if (typeof [Link] === "function" && typeof [Link]
=== "function"){
var cur = [Link](eid);
var target = [Link]( [Link](cur * HP_MULT), cur );
// Some builds prevent setHealth on certain entities; try-catch
[Link](eid, target);
return true;
}
} catch(e) { dlog("setHealth failed: " + e); }
return false;
}

// apply chase velocity (rudimentary) to increase perceived speed


function applyChaseVelocity(eid){
try {
var px = [Link](), pz = [Link]();
var ex = [Link](eid), ez = [Link](eid);
var dx = px - ex, dz = pz - ez;
// normalize and apply small factor
var len = [Link](dx*dx + dz*dz);
if (len > 0.001) {
var fx = (dx/len) * SPEED_MULT * 0.12;
var fz = (dz/len) * SPEED_MULT * 0.12;
// setVelX/Z if available
if (typeof [Link] === "function" && typeof [Link]
=== "function"){
try { [Link](eid, fx); [Link](eid, fz); }
catch(e){}
}
}
} catch(e){ dlog("applyChaseVelocity err:"+e); }
}

// attempt to increase damage by intercepting attacks using attackHook (below)


// We will reduce victim health extra when attacker is hostile and event
active.

// Bed helpers
function keyFromPos(x,y,z){ return x + ":" + y + ":" + z; }
function storeAndRemoveBed(x,y,z){
try {
var k = keyFromPos(x,y,z);
if (removedBeds[k]) return; // already removed by us
var oldId = 0, oldData = 0;
try { oldId = [Link](x,y,z); } catch(e){}
try { oldData = (typeof [Link] === "function") ?
[Link](x,y,z) : 0; } catch(e){}
removedBeds[k] = {x:x,y:y,z:z, id: oldId, data: oldData, removedAt:
tickCounter};
// remove visually
try { [Link](x,y,z, 0); } catch(e){}
dlog("bed removed stored at " + k);
} catch(e){ dlog("storeAndRemoveBed err: "+e); }
}
function restoreAllBeds(){
try {
for (var k in removedBeds){
try {
var b = removedBeds[k];
// only place if current block is empty to avoid overwriting
var cur = 0;
try { cur = [Link](b.x,b.y,b.z); } catch(e){}
if (cur === 0) {
try { [Link](b.x,b.y,b.z, [Link]); } catch(e){}
try { if (typeof [Link] === "function")
[Link](b.x,b.y,b.z,[Link]); } catch(e){}
dlog("restored bed " + k);
} else {
dlog("skip restore " + k + " current block non-empty");
}
} catch(e2){ dlog("restore bed inner err:" + e2); }
}
removedBeds = {};
} catch(e){ dlog("restoreAllBeds err:" + e); }
}

function hideDarkOverlay(){
try {
if (!overlayWindow) return;
var ctx =
[Link]();
[Link](new [Link]({ run: function(){
try { [Link](); overlayWindow = null; } catch(e)
{ dlog("hideDarkOverlay inner: " + e); }
}}));
} catch(e){ dlog("hideDarkOverlay err: " + e); }
}

// Start event
function startEvent(){
if (active) return;
active = true;
dlog("BloodMoon START");
// save difficulty if possible
try { if (typeof [Link] === "function") savedDifficulty =
[Link](); } catch(e){}
// set difficulty hard if possible
try { if (typeof [Link] === "function")
[Link](3); } catch(e){}
// show dark overlay
showDarkOverlay();
// play ominous sound once near player
try { var px = [Link]([Link]()), py = [Link]([Link]()),
pz = [Link]([Link]()); playSoundAt(px,py,pz,"[Link]",1,1); }
catch(e){}
}

// End event
function endEvent(){
if (!active) return;
active = false;
dlog("BloodMoon END");
// restore difficulty
try { if (typeof [Link] === "function" && savedDifficulty !==
null) [Link](savedDifficulty); } catch(e){}
// hide overlay
hideDarkOverlay();
// restore beds we removed
restoreAllBeds();
// play relief sound
try { var px = [Link]([Link]()), py = [Link]([Link]()),
pz = [Link]([Link]()); playSoundAt(px,py,pz,"[Link]",1,1); }
catch(e){}
}

// Called each tick


function onTick(){
tickCounter++;
try {
var t = 0;
try { if (typeof [Link] === "function") t = [Link](); }
catch(e){}
var shouldBeActive = (t >= T_START && t < T_END);
if (shouldBeActive && !active) startEvent();
if (!shouldBeActive && active) endEvent();

if (active) {
// keep difficulty forced (redundant)
try { if (typeof [Link] === "function")
[Link](3); } catch(e){}

// periodically play ominous sound


if (tickCounter - lastSoundTick > SOUND_INTERVAL_TICKS) {
lastSoundTick = tickCounter;
try {
var px = [Link]([Link]()), py =
[Link]([Link]()), pz = [Link]([Link]());
playSoundAt(px,py,pz,"[Link]",1,1);
} catch(e){}
}

// buff nearby hostile mobs


try {
var ents = getAllEntities();
for (var i=0;i<[Link];i++){
try {
var eid = ents[i];
var name = (getEntityName(eid) || "").toLowerCase();
if (!isHostileByNameLower(name)) continue;
// increase health
ensureBoostHealth(eid);
// increase chase velocity
applyChaseVelocity(eid);
// (we rely on attackHook to multiply damage)
} catch(eInner){}
}
} catch(e) { dlog("entity loop err: " + e); }
}
} catch(e){ dlog("onTick top err: " + e); }
}

// Intercept bed usage: when player tries to use bed during event, remove the
bed and store it
function onUseItem(x,y,z,itemId,blockId,side,player){
try {
// bed block id in many old MCPE versions is 26
if (!active) return;
if (blockId == 26 || blockId == 26) { // 26 common; double-check
// Before removing, check if this bed was previously registered as
player's spawn (registeredSpawnBeds)
try {
var pid = player || [Link]();
var reg = registeredSpawnBeds[pid];
var posKey = keyFromPos(x,y,z);
if (reg && reg === posKey) {
// if this is the registered spawn bed for this player, do
not remove it.
// Instead play negative sound and prevent sleeping by
quickly toggling bed removal/restore
try { playSoundAt(x,y,z,"[Link]",0.8,1); } catch(e)
{}
// quick flash: remove and re-place after few ticks to
simulate "bed failing" but keep spawn
storeAndRemoveBed(x,y,z);
// mark as will restore quickly (we do not delete
registered spawn mapping)
// note: we will restore on endEvent or here after short
timeout
return;
} else {
// store and remove (we will restore at endEvent)
storeAndRemoveBed(x,y,z);
return;
}
} catch(eUse){ dlog("onUseItem bed handling err: " + eUse); }
}
} catch(e){ dlog("onUseItem err: " + e); }
}

// Hook: detect when player uses bed in non-bloodNight to register that bed as
their spawn (best-effort)
function onUseItemRegisterBed(x,y,z,itemId,blockId,side,player){
try {
if (active) return; // only register spawn when not active (user
actually sleeping)
if (blockId == 26) {
// record that this player used this bed (we assume set spawn)
try {
var pid = player || [Link]();
registeredSpawnBeds[pid] = keyFromPos(x,y,z);
dlog("registered spawn bed for pid " + pid + " at " +
registeredSpawnBeds[pid]);
} catch(e){}
}
} catch(e){ dlog("onUseItemRegisterBed err: " + e); }
}

// Attack hook: increase damage taken when victim is attacked by hostile during
active event
function onAttack(attacker, victim){
try {
if (!active) return;
if (!attacker || !victim) return;
// we want to detect hostile attacker and player victim
try {
var atName = (getEntityName(attacker) || "").toLowerCase();
var vtName = (getEntityName(victim) || "").toLowerCase();
// if victim is player (or contains player keyword)
var victimIsPlayer = [Link]("player") !== -1;
if (!victimIsPlayer) return;
if (!isHostileByNameLower(atName)) return;
// multiplier: determine base damage by reading current health and
subtract extra
try {
if (typeof [Link] === "function" && typeof
[Link] === "function") {
var cur = [Link](victim);
// try to get last damage? no standard. We apply extra
damage proactively
var extra = [Link](1, [Link]( (DAMAGE_MULT - 1.0) * 3
)); // approx extra
var newh = [Link](0, cur - extra);
[Link](victim, newh);
dlog("Applied extra damage " + extra + " to victim " +
victim);
}
} catch(eDamage){ dlog("attack extra damage failed: " + eDamage); }
} catch(eInner) { dlog("onAttack inner err: " + eInner); }
} catch(e){ dlog("onAttack err: " + e); }
}

// Public hooks to register with ModPE environment


return {
tick: onTick,
useItem: function(x,y,z,itemId,blockId,side,player){
// call both registration and bloodNight handler
try { onUseItemRegisterBed(x,y,z,itemId,blockId,side,player); }
catch(e){}
try { onUseItem(x,y,z,itemId,blockId,side,player); } catch(e){}
},
attackHook: function(attacker, victim){ try { onAttack(attacker, victim); }
catch(e){} },
setDebug: function(v){ DEBUG = !!v; dlog("debug set " + DEBUG); }
};
})();

// ----------------- Hook bindings for ModPE -----------------


function modTick(){ try{ [Link](); } catch(e){ try{ print("BM tick
error:"+e); }catch(_){} } }
function useItem(x,y,z,itemId,blockId,side,player)
{ try{ [Link](x,y,z,itemId,blockId,side,player); } catch(e){ try{ print("BM
useItem err:"+e); }catch(_){} } }
// attack hook names vary by ModPE build; try common ones:
function attackHook(attacker, victim){ try{ if (typeof [Link] ===
"function") [Link](attacker, victim); } catch(e)
{ try{ [Link](attacker, victim); } catch(e2){} } }
// Some builds call 'attackHook' directly or 'entityAttack' variants; keep
resilient by defining both
// If your build expects different signature, let me know exact error text.

// ----------------- User commands for control -----------------


function procCmd(cmd){
try {
if (!cmd) return false;
var s = [Link]();
if (s === "bn_debug on") { [Link](true); clientMessage("bn_debug ON");
return true; }
if (s === "bn_debug off") { [Link](false); clientMessage("bn_debug
OFF"); return true; }
if (s === "bn_status") {
clientMessage("BloodMoon active = " + (typeof active !== "undefined" ?
active : "unknown"));
return true;
}
if ([Link]("bn_time ")===0){
// quick test: set time to given value
var parts = [Link](/\s+/);
var v = parseInt(parts[1]) || 18000;
try { [Link](v); } catch(e){ clientMessage("setTime failed"); }
return true;
}
} catch(e){ try{ print("bn procCmd err:"+e); } catch(_){} }
return false;
}

========================

Karena “isinya sama” itu cuma benar di level label, bukan di level kenyataan. Di
dunia rasa, detail kecil itu bukan detail. Itu penentu segalanya.

Pertama, jenis dan kualitas bahan. “Pemanis” di label bisa berarti gula pasir
biasa, gula aren, glukosa cair, sirup fruktosa, atau campuran semuanya. Rasanya
beda, tingkat manisnya beda, cara nempel di lidah juga beda. “Bubuk coklat” juga
bukan satu spesies tunggal. Ada kakao natural, kakao alkalized, kakao dari biji
kakao yang berbeda daerah, tingkat sangrai berbeda. Sedikit beda asal atau proses,
rasanya bisa geser jauh.

Kedua, proporsi dan rasio. Dua merek bisa sama-sama pakai gula dan bubuk coklat,
tapi perbandingan gramnya beda tipis saja sudah mengubah rasa total. Otak manusia
itu sensitif soal keseimbangan. Lebih sedikit coklat bikin rasa manis “kosong”.
Lebih banyak coklat bikin pahit naik. Tidak ada titik netral universal, tiap merek
pilih jalannya sendiri.

Ketiga, lemak. Ini sering diremehkan, padahal lemak itu pengangkut rasa. Ada coklat
yang pakai cocoa butter, ada yang pakai lemak nabati lain, ada yang campur. Lemak
menentukan apakah coklat terasa creamy, waxy, atau cepat lumer. Dua coklat dengan
rasa dasar mirip bisa terasa sangat berbeda hanya karena jenis lemaknya beda.
Keempat, proses produksi. Suhu pemanasan, lama pengadukan, cara pencampuran, dan
pendinginan memengaruhi struktur partikel coklat. Ini bukan urusan pabrik sok
ribet. Struktur mikroskopis menentukan bagaimana coklat meleleh di mulut dan kapan
rasa dilepaskan. Meleleh cepat = rasa langsung “nendang”. Meleleh lambat = rasa
muncul bertahap.

Kelima, zat tambahan kecil yang tidak terasa “sendiri” tapi mengubah segalanya.
Contohnya vanila, garam mikro, atau emulsifier. Kamu tidak akan bilang “oh ini rasa
vanila”, tapi tanpa itu coklatnya terasa datar. Ini seperti bumbu di masakan. Tidak
kelihatan, tapi tanpa itu rasanya hambar.

Keenam, profil rasa yang disengaja. Merek tidak mengejar “rasa coklat paling
benar”, mereka mengejar target pasar. Ada yang mau aman, manis, ramah anak. Ada
yang mau agak pahit, dewasa, berkarakter. Jadi perbedaan rasa itu bukan kecelakaan,
tapi keputusan bisnis.

Ketujuh, psikologi dan ekspektasi. Kemasan, harga, merek, dan pengalaman sebelumnya
memengaruhi cara otak menilai rasa. Coklat yang dimakan dengan ekspektasi “ini
premium” sering terasa lebih kompleks, meskipun secara kimia tidak sejauh itu. Otak
ikut campur, seperti biasa.

Jadi kesimpulannya begini. Walaupun daftar bahan coklat terlihat mirip, jenis
bahan, rasio, lemak, proses, tambahan kecil, dan tujuan merek membuat hasil
akhirnya beda jauh. Label itu ringkasan. Rasa itu hasil perang kecil antara fisika,
kimia, dan strategi marketing.

Coklat tidak beda rasa karena kamu halu.


Coklat beda rasa karena “sama” di label itu bohong yang disepakati bersama.

You might also like