Ice Cream
Turns your enemies into ice. but beware, they slide a lot more!
← Back to main
World Code:
//Timeout Code by Sulfrox
class MinQueue{constructor(i,t,e){t=e=Uint32Array,this.c=i,this.k=new t(i+1),this.p=new e(i+1),this.h=!1,this.l=0}bbu(i){let t=this.k,e=this.p,r=t[i],h=e[i];for(;i>1;){let s=i>>>1;if(e[s]<=h)break;t[i]=t[s],e[i]=e[s],i=s}t[i]=r,e[i]=h}bbd(i){let t=this.k,e=this.p,r=t[i],h=e[i],s=1+(this.l>>>1),u=this.l+1;for(;i<s;){let n=i<<1,l=e[n],m=t[n],_=n,p=n+1;if(p<u&&e[p]<l&&(l=e[p],m=t[p],_=p),l>=h)break;t[i]=m,e[i]=l,i=_}t[i]=r,e[i]=h}push(i,t){if(this.l===this.c)throw"heap full";if(this.h)this.k[1]=i,this.p[1]=t,this.l++,this.bbd(1),this.h=!1;else{let e=this.l+1;this.k[e]=i,this.p[e]=t,this.l++,this.bbu(e)}}pop(){if(0!==this.l)return this.rpe(),this.l--,this.h=!0,this.k[1]}peekPriority(){if(0!==this.l)return this.rpe(),this.p[1]}peek(){if(0!==this.l)return this.rpe(),this.k[1]}rpe(){this.h&&(this.k[1]=this.k[this.l+1],this.p[1]=this.p[this.l+1],this.bbd(1),this.h=!1)}}let currently_running_timer,TimerQueue=new MinQueue(1024),TimerDictionary=[],TimerNum=0,TickNum=0;function setTimeOut(i,t){let e=TickNum+Math.floor(t/50);TimerDictionary[TimerNum]=i,TimerQueue.push(TimerNum,e),TimerNum++}function tick(){if(TickNum++,currently_running_timer)currently_running_timer(),currently_running_timer=void 0;else if(TimerQueue.peekPriority()<=TickNum){let i=TimerQueue.peek();void 0!==i&&(currently_running_timer=TimerDictionary[i]),TimerQueue.pop(),delete TimerDictionary[i]}}
const frozenPlayers = new Set();
onPlayerDamagingOtherPlayer = (attackerId, victimId, damageDealt, withItem) => {
const held = api.getHeldItem(attackerId);
if (
withItem === "Diamond Sword" &&
held?.attributes?.customDisplayName === "Ice Cream"
) {
freezePlayer(victimId);
}
//Extra knockback only if victim is frozen
if (frozenPlayers.has(victimId)) {
const facing = api.getPlayerFacingInfo(attackerId);
const dir = facing?.dir;
if (dir) {
const planeMag = Math.sqrt(dir[0] * dir[0] + dir[2] * dir[2]) || 1;
const knockbackX = dir[0] / planeMag * 20;
const knockbackY = 0;
const knockbackZ = dir[2] / planeMag * 20;
api.applyImpulse(victimId, knockbackX, knockbackY, knockbackZ);
}
}
return damageDealt;
};
function freezePlayer(playerId) {
if (frozenPlayers.has(playerId)) return;
frozenPlayers.add(playerId);
// Ice visual
api.updateEntityNodeMeshAttachment(playerId, "TorsoNode", "BloxdBlock", {
blockName: "Ice",
size: 1.2,
meshOffset: [0, 0, 0]
}, [0, -0.1, 0], [0, 0, 0]);
api.updateEntityNodeMeshAttachment(playerId, "HeadMesh", "BloxdBlock", {
blockName: "Ice",
size: 1.2,
meshOffset: [0, 0, 0]
}, [0, 0, 0], [0, 0, 0]);
// Effect
api.applyEffect(playerId, "Frozen", 10000, {
icon: "Frozen",
displayName: "Frozen"
});
// Disable jump/damage
api.setClientOption(playerId, "jumpAmount", 0);
api.setClientOption(playerId, "dealingDamageMultiplier", 0);
// Restore after 10s
setTimeOut(() => {
api.updateEntityNodeMeshAttachment(playerId, "TorsoNode", null);
api.updateEntityNodeMeshAttachment(playerId, "HeadMesh", null);
api.setClientOption(playerId, "jumpAmount", 8);
api.setClientOption(playerId, "dealingDamageMultiplier", 1);
frozenPlayers.delete(playerId);
api.sendMessage(playerId, "The ice has melted!", { color: "aqua" });
}, 10000);
}