UNPKG

grow-items

Version:

A standalone items.dat parser for Growtopia

9 lines (7 loc) 9.38 kB
/*! * grow-items v1.2.0 * Copyright 2025 * Licensed under MIT (https://github.com/StileDevs/grow-items/blob/main/LICENSE) */ "use strict";var growItems=(()=>{var h=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var w=(s,t)=>{for(var e in t)h(s,e,{get:t[e],enumerable:!0})},l=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of b(t))!m.call(s,r)&&r!==e&&h(s,r,{get:()=>t[r],enumerable:!(i=d(t,r))||i.enumerable});return s};var p=s=>l(h({},"__esModule",{value:!0}),s);var c={};w(c,{ExtendBuffer:()=>a,ItemsDat:()=>n});var a=class{constructor(t,e=0){this.mempos=e;this.data=Array.isArray(t)?t:new Array(t).fill(0)}data;read(t){let e=0;for(let i=0;i<t;i++)e|=this.data[this.mempos+i]<<i*8;return this.mempos+=t,e>>>0}readSigned(t){let e=this.read(t),i=t*8;return e&1<<i-1&&(e=e-(1<<i)),e}write(t,e){for(let i=0;i<e;i++)this.data[this.mempos+i]=t>>i*8&255;this.mempos+=e}readU8=()=>this.read(1);readU16=(t=!1)=>t?this.readBE(2):this.read(2);readU32=(t=!1)=>t?this.readBE(4):this.read(4);readI8=()=>this.readSigned(1);readI16=(t=!1)=>t?this.readSignedBE(2):this.readSigned(2);readI32=(t=!1)=>t?this.readSignedBE(4):this.readSigned(4);readBE(t){let e=0;for(let i=0;i<t;i++)e=e<<8|this.data[this.mempos+i];return this.mempos+=t,e>>>0}readSignedBE(t){let e=this.readBE(t),i=t*8;return e&1<<i-1&&(e=e-(1<<i)),e}writeU8=t=>this.write(t,1);writeU16=(t,e=!1)=>e?this.writeBE(t,2):this.write(t,2);writeU32=(t,e=!1)=>e?this.writeBE(t,4):this.write(t,4);writeI8=t=>this.write(t,1);writeI16=(t,e=!1)=>e?this.writeBE(t,2):this.write(t,2);writeI32=(t,e=!1)=>e?this.writeBE(t,4):this.write(t,4);writeBE(t,e){for(let i=0;i<e;i++)this.data[this.mempos+i]=t>>(e-1-i)*8&255;this.mempos+=e}writeU=(t,e,i=!1)=>{({1:this.writeU8,2:this.writeU16,4:this.writeU32})[t](e,i)};writeI=(t,e,i=!1)=>{({1:this.writeI8,2:this.writeI16,4:this.writeI32})[t](e,i)};async readString(t=!1){let e=t?this.readBE(2):this.read(2),i=this.data.slice(this.mempos,this.mempos+e);return this.mempos+=e,String.fromCharCode(...i)}async writeString(t,e=!1){let i=t.split("").map(r=>r.charCodeAt(0));e?this.writeBE(t.length,2):this.write(t.length,2);for(let r of i)this.data[this.mempos++]=r}};var n=class{buffer;key="PBG892FXX982ABC*";stringFields=["name","texture","extraFile","petName","petPrefix","petSuffix","petAbility","extraOptions","texture2","extraOptions2","punchOptions","chairTexture","itemRenderer","info"];meta={items:[],itemCount:0,version:0};constructor(t){this.buffer=new a(t)}getWriteSize(t){let e=130*t.length;for(let i of t){let r=Object.keys(i);for(let f of r){let u=i[f];if(this.stringFields.includes(f)&&typeof u=="string"&&(e+=u.length+2),typeof i[f]=="object"){let o=i[f];e+=o.length}}}return e+4+2}async decode(){this.buffer.mempos=0,this.meta.version=this.buffer.readU16(),this.meta.itemCount=this.buffer.readI32();for(let t=0;t<this.meta.itemCount;t++){let e={};e.id=this.buffer.readI32(),e.flags=this.buffer.readU8(),e.flagsCategory=this.buffer.readU8(),e.type=this.buffer.readU8(),e.materialType=this.buffer.readU8(),e.name=await this.readString({id:e.id,encoded:!0}),e.texture=await this.readString({id:e.id}),e.textureHash=this.buffer.readI32(),e.visualEffectType=this.buffer.readU8(),e.cookingTime=this.buffer.readI32(),e.textureX=this.buffer.readU8(),e.textureY=this.buffer.readU8(),e.storageType=this.buffer.readU8(),e.isStripeyWallpaper=this.buffer.readU8(),e.collisionType=this.buffer.readU8(),e.breakHits=this.buffer.readU8()/6,e.resetStateAfter=this.buffer.readI32(),e.bodyPartType=this.buffer.readU8(),e.rarity=this.buffer.readI16(),e.maxAmount=this.buffer.readU8(),e.extraFile=await this.readString({id:e.id}),e.extraFileHash=this.buffer.readI32(),e.audioVolume=this.buffer.readI32(),e.petName=await this.readString({id:e.id}),e.petPrefix=await this.readString({id:e.id}),e.petSuffix=await this.readString({id:e.id}),e.petAbility=await this.readString({id:e.id}),e.seedBase=this.buffer.readU8(),e.seedOverlay=this.buffer.readU8(),e.treeBase=this.buffer.readU8(),e.treeLeaves=this.buffer.readU8(),e.seedColor=this.buffer.readI32(),e.seedOverlayColor=this.buffer.readI32(),e.ingredient=this.buffer.readI32(),e.growTime=this.buffer.readI32(),e.fxFlags=this.buffer.readI32(),e.extraOptions=await this.readString({id:e.id}),e.texture2=await this.readString({id:e.id}),e.extraOptions2=await this.readString({id:e.id}),e.unknownInt1=this.buffer.readI32(),e.unknownInt2=this.buffer.readI32(),e.flags2=this.buffer.readI32(),e.extraBytes=this.buffer.data.slice(this.buffer.mempos,this.buffer.mempos+=60),e.tileRange=this.buffer.readI32(),e.vaultCapacity=this.buffer.readI32(),this.meta.version>=11&&(e.punchOptions=await this.readString({id:e.id}),this.meta.version>=12&&(e.flags3=this.buffer.readI32(),e.bodyPart=this.buffer.data.slice(this.buffer.mempos,this.buffer.mempos+=9)),this.meta.version>=13&&(e.lightRange=this.buffer.readI32()),this.meta.version>=14&&(e.unknownInt3=this.buffer.readI32()),this.meta.version>=15&&(e.canSit=this.buffer.readU8(),e.playerOffsetX=this.buffer.readI32(),e.playerOffsetY=this.buffer.readI32(),e.chairTextureX=this.buffer.readI32(),e.chairTextureY=this.buffer.readI32(),e.chairLegOffsetX=this.buffer.readI32(),e.chairLegOffsetY=this.buffer.readI32(),e.chairTexture=await this.readString({id:e.id})),this.meta.version>=16&&(e.itemRenderer=await this.readString({id:e.id})),this.meta.version>=17&&(e.extraFlags1=this.buffer.readI32()),this.meta.version>=18&&(e.itemRendererHash=this.buffer.readI32()),this.meta.version>=19&&(e.unknownBytes2=this.buffer.data.slice(this.buffer.mempos,this.buffer.mempos+=9)),this.meta.version>=21&&(e.unknownShort1=this.buffer.readI16()),this.meta.version>=22&&(e.info=await this.readString({id:e.id}))),this.meta.items.push(e)}}async encode(){this.buffer.mempos=0;let t=this.getWriteSize(this.meta.items);this.buffer=new a(t),this.buffer.writeI16(this.meta.version),this.buffer.writeI32(this.meta.items.length);for(let e of this.meta.items){if(this.buffer.writeI32(e.id),this.buffer.writeU8(e.flags),this.buffer.writeU8(e.flagsCategory),this.buffer.writeU8(e.type),this.buffer.writeU8(e.materialType),await this.writeString(e.name,e.id,!0),await this.writeString(e.texture,e.id),this.buffer.writeI32(e.textureHash),this.buffer.writeU8(e.visualEffectType),this.buffer.writeI32(e.cookingTime),this.buffer.writeU8(e.textureX),this.buffer.writeU8(e.textureY),this.buffer.writeU8(e.storageType),this.buffer.writeU8(e.isStripeyWallpaper),this.buffer.writeU8(e.collisionType),this.buffer.writeU8(e.breakHits*6),this.buffer.writeI32(e.resetStateAfter),this.buffer.writeU8(e.bodyPartType),this.buffer.writeI16(e.rarity),this.buffer.writeU8(e.maxAmount),await this.writeString(e.extraFile,e.id),this.buffer.writeI32(e.extraFileHash),this.buffer.writeI32(e.audioVolume),await this.writeString(e.petName,e.id),await this.writeString(e.petPrefix,e.id),await this.writeString(e.petSuffix,e.id),await this.writeString(e.petAbility,e.id),this.buffer.writeU8(e.seedBase),this.buffer.writeU8(e.seedOverlay),this.buffer.writeU8(e.treeBase),this.buffer.writeU8(e.treeLeaves),this.buffer.writeI32(e.seedColor),this.buffer.writeI32(e.seedOverlayColor),this.buffer.writeI32(e.ingredient),this.buffer.writeI32(e.growTime),this.buffer.writeI32(e.fxFlags),await this.writeString(e.extraOptions,e.id),await this.writeString(e.texture2,e.id),await this.writeString(e.extraOptions2,e.id),this.buffer.writeI32(e.unknownInt1),this.buffer.writeI32(e.unknownInt2),this.buffer.writeI32(e.flags2),e.extraBytes)for(let i of e.extraBytes)this.buffer.writeU8(i);if(this.buffer.writeI32(e.tileRange),this.buffer.writeI32(e.vaultCapacity),this.meta.version>=11){if(await this.writeString(e.punchOptions||"",e.id),this.meta.version>=12&&(this.buffer.writeI32(e.flags3),e.bodyPart))for(let i of e.bodyPart)this.buffer.writeU8(i);if(this.meta.version>=13&&this.buffer.writeI32(e.lightRange),this.meta.version>=14&&this.buffer.writeI32(e.unknownInt3),this.meta.version>=15&&(this.buffer.writeU8(e.canSit),this.buffer.writeI32(e.playerOffsetX),this.buffer.writeI32(e.playerOffsetY),this.buffer.writeI32(e.chairTextureX),this.buffer.writeI32(e.chairTextureY),this.buffer.writeI32(e.chairLegOffsetX),this.buffer.writeI32(e.chairLegOffsetY),await this.writeString(e.chairTexture||"",e.id)),this.meta.version>=16&&await this.writeString(e.itemRenderer||"",e.id),this.meta.version>=17&&this.buffer.writeI32(e.extraFlags1),this.meta.version>=18&&this.buffer.writeI32(e.itemRendererHash),this.meta.version>=19&&e.unknownBytes2)for(let i of e.unknownBytes2)this.buffer.writeU8(i);this.meta.version>=21&&this.buffer.writeI16(e.unknownShort1),this.meta.version>=22&&this.writeString(e.info,e.id)}}}async readString(t={encoded:!1}){let e=this.buffer.readI16();if(t.encoded){let i=[];for(let r=0;r<e;r++)i.push(String.fromCharCode(this.buffer.data[this.buffer.mempos]^this.key.charCodeAt((t.id+r)%this.key.length))),this.buffer.mempos++;return i.join("")}else{let i=[];for(let r=0;r<e;r++)i.push(String.fromCharCode(this.buffer.data[this.buffer.mempos++]));return i.join("")}}async writeString(t,e,i=!1){if(this.buffer.writeI16(t.length),i)for(let r=0;r<t.length;r++){let f=t.charCodeAt(r)^this.key.charCodeAt((r+e)%this.key.length);this.buffer.writeU8(f)}else for(let r=0;r<t.length;r++)this.buffer.writeU8(t.charCodeAt(r))}};return p(c);})(); //# sourceMappingURL=index.global.js.map