BloodMoon ModPE Api Code
BloodMoon ModPE Api Code
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;
// 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){}
}
if (active) {
// keep difficulty forced (redundant)
try { if (typeof [Link] === "function")
[Link](3); } catch(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); }
}
========================
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.