#mod_development

1 messages ยท Page 73 of 1

pulsar rock
#

It reports no mods need updating

sour island
#

A delay in update tracking can also be attributed to steam

pulsar rock
#

Yeah, an hour long delay though?

#

Workshop's wack, I guess.

#

Just added a vote restart command as a workaround if it's being slow

#

ยฏ_(ใƒ„)_/ยฏ

sour island
#

I know a guy who has scripts - doesn't seem to have any delay

#

I can give him your discord# if you want

drifting ore
# pulsar rock Yeah, an hour long delay though?

have you attempted using udderly updates? it's about as smooth as it gets for workshop checking and auto restarting. has fail safes to prevent duping and inv loss also by sending clients back to title screen 15 seconds before save. then saves and restarts the server.

drifting ore
#

uses workshop polling feature which is probably way better than whatever call the discorebot is using

pulsar rock
#

I'm using the new vanilla command to check for updates

drifting ore
#

i rebuilt this also using the open source code and some of evelyns additions, but her version works perfectly to my knowledge

#

i just needed something to auto restart the server on a regular basis on top of that since we dont get mod updates often

#

the only part you'd need is if you are running a ded server, to update the .bat file so it auto reruns the bat when it's quit

#

just add :start to the beginning of your .bat file, first line
and add goto start at the end. will always auto restart when the quit command is used

#

pretty much only time it wont auto restart actually is if you hard close the command window

#

i use it in tandem with windows scheduler to make sure it restarts every 6 hours, or 6 hours after the last restart.

brave pier
#

Does anyone know what might be causing the two pixel wide line to appear on the south facing poster?

drifting ore
#

is anyone in contact with Brita? i'm trying to reach to them to see if it's okay if i release a patch for Brita weapons that adds all weapons to the display category Wepfire

limber oar
#

Does anyone have experience adding "custom" context options to clothing? Think the "Hood Up," "Hood Down" options for hoodies; exact same functionality, just with custom text (in this case I'm trying to "Hike Up" or "Let Out" a skirt). I've added the options to the ContextMenu file, but in-game it's showing the key, not the value: "ContextMenu_HikeUp," instead of "Hike Up."

I know that I could use the ItemTweaker API but I'd rather not add dependencies just for this if possible. There's got to be a way to do this vanilla, but every mod I've checked that ostensibly offers this functionality also seems to have the same problem.

late hound
limber oar
#

There's no space except in the text defined in ContextMenu, in the clothing script it calls HikeUp and LetOut respectively and in ContextMenu it's defined as ContextMenu_HikeUp and ContextMenu_LetOut respectively.

sour island
#

The translation file probably says ContextMenu_Hike Up = "Hike Up" get rid of the space in the ID

#

When the game can't find the translation it returns the string given

#

if it has a space then you're giving it that ID

limber oar
#

But it doesn't: ContextMenu_HikeUp = "Hike Up",

late hound
#

"ContextMenu_Hike Up," instead of "Hike Up."

#

I was looking at this^

limber oar
#

Ah fuck, that's my typo in the Discord message then

#

Had a line break there in Discord and didn't spot it

late hound
#

let me show an example of what to do

#
    item HairBow
    {
        DisplayCategory = Clothing,        
        Type = Clothing,
        DisplayName = HairBow,
        ClothingItem = HairBows,
        ClothingItemExtra        = Base.HairBows_UP,
        ClothingItemExtraOption = WearHigher,            
        IconsForTexture = BowBlue;BowPurple;BowRed;BowPink,
        BodyLocation = Necklace,
        CanHaveHoles = false,
        Weight = 0.05,    
        WorldStaticModel = WorldItem_HairBow,
    }
limber oar
#

Let me remove my ExtraSubmenu and see if that does anything.

late hound
#

I remove that tag as a personal preference

limber oar
#

I may be missing something obvious but as far as I can tell I've got it all set up properly. Wholly possible I am just staring at a typo though.

    {
        DisplayCategory = Clothing,
        Type = Clothing,
        DisplayName = School Skirt,
        ClothingItem = SchoolUniform_Skirt,
        BodyLocation = Skirt,
        Icon = SchoolUniformSkirt,
        BloodLocation = ShortsShort,
        ClothingItemExtra = SchoolUniform_SkirtMini,
        ClothingItemExtraOption = HikeUp,
        ClothingExtraSubmenu = LetOut,
        Insulation = 0.1,
        WindResistance = 0.01,
        FabricType = Cotton,
        WorldStaticModel = Skirt_Short_Ground,
    }```
#
    ContextMenu_HikeUp = "Hike Up",
    ContextMenu_LetOut = "Let Out",
}```
sour island
#

Where's your translation file located / what is it named?

late hound
#

This should work, seems to me like the game is gaslighting you, so check if you are subscribed to your own mod, if you are modding in the correct directory, and completely reboot the game. And yes, make sure your translation files are in the correct area.

sour island
#

ClothingItemExtra = SchoolUniform_SkirtMini,
ClothingItemExtraOption = HikeUp,

limber oar
late hound
#

that would be it

limber oar
#

That fixed it.

#

Thanks, guys. I hope you enjoyed this little foray into stupidity with me.

late hound
#

everyone goes through this, don't worry

limber oar
#

I even explained it to my rubber duck!

#

In software engineering, rubber duck debugging (or rubberducking) is a method of debugging code by articulating a problem in spoken or written natural language. The name is a reference to a story in the book The Pragmatic Programmer in which a programmer would carry around a rubber duck and debug their code by forcing themselves to explain it, l...

sour island
#

helps when the rubber ducks respond

ancient grail
#

Weird why is it errored

sour island
#

too new

ancient grail
#

Ahh

sour island
#

my journal update is going p well

#

managed to make it update old journals accordingly

#

working on updating reading/tooltip to match

#

sandbox option for how the old style worked

faint jewel
#

hello all.

cinder shadow
#

hello im trying to learn the basics, such as how to add a new item in a mod. I tried creating just copy of a garbage bag, but with different name simply to learn this process, but keep getting the following error. Anyone know what this means?

civic lava
#

Is there another site like this " https://zomboid-javadoc.com/41.65/" with information on lua, project zomboid, & general place to start when modding. (i've sucessfully rewritten noodle legs but but if there are any more websites to help me understand whats possible to change & do in PZ that would be sick

bronze yoke
sour island
#

I both love and hate that Co' made those identical lol

frank elbow
drifting ore
#

Someone please create a mod that makes alcohol effects last much longer!!!

sour island
#

Why not you

cinder shadow
tropic tide
#

Please, how can i save and relaod a variable pointing to a specific bag. when i reload game or create new player after death, the variable is empty in my script ?
i create my var like this :
tbag=player:getInventory():AddItem("TBoT.Bag_TBoT")
After that i can add item like this:
tbag:getInventory():AddItem("Base.Pistol")

sour island
#

I don't think you can save references

#

you could check if they have one of those bags and set the variable to that

#

if they don't have a bag you can spawn one and then set it

tropic tide
#

there is only One bag in my world like that, how i could check . Can you tell me the command ?

bronze yoke
#

you won't be able to access it if it's not in a loaded area

sour island
#

the playerinventory is an itemContainer (I get the class names mixed up) but they have a bunch of getItem(s) methods

#

I'm not even sure why the tbag variable here is needed to be honest

tropic tide
#

because i use the bag like a shop. i made a Mod which interact witch a bot on twitch. When viewer send specific command on twitch i interact in PZ

sour island
#

so the player has to go back to this specific bag?

tropic tide
#

yes

sour island
#

and there's only one in the world?

tropic tide
#

i choose a bag because on the first load, the player (the streamer) put it where he want

#

yes only one

sour island
#

what happens if, like Albion says, the bag isn't loaded?

tropic tide
#

for the moment, i m not in face of this probleme. I don t know how testing the presence of the bag in loaded area

#

the twitch script can store item... and send to the bag when the player is near (this is the concept for the moment. ) ..

sour island
#
player:getInventory():getItemFromTypeRecurse("TBoT.Bag_TBoT")
tropic tide
#

this command give me the bag if in the local area ?

sour island
#

if it's in the player's inventory

#

tracking an item that can be anywhere isn't really all that feasible

#

you're better off updating it's contents when the player picks it up

#

or interacts with it

bronze yoke
#

you can try to detect when it's being loaded and unloaded, but it seems like a hassle

tropic tide
#

when the player pick it up... interesting...

#

you made a mod whith shop i see. How can you store the item in the shop when player go away ?

sour island
#

I don't have actual items in the shop

#

it's just tables/lists

#

I recommend you add items to globalData

#

when the player interacts with the bag - pull the data from there, spawn items, clear the list

tropic tide
#

excellent !!!

sour island
#

you could use playerModData but it wouldn't carry over when they die

tropic tide
#

Thank you for the idea ! Thx @sour island and @bronze yoke

#

you give me a new point of view on my work... i try that

sour island
#

no problem, I forget what the game design term/principle is called, but basically don't try to 'simulate' everything -- focus on the end result, the rest can be smoke and mirrors / deception

faint jewel
#

question time.

#

local objects = square:getMovingObjects() I am doing this to get the vehicles in a square, and it works. but the moving object getId() is DIFFERENT that than the VEHICLE:getId() how do i get the vehicles id from the moving object id.

sour island
#

heh

ruby urchin
#

if you print that movingObject and basevehicle, you get the same entity?

sour island
#

BaseVehicle does indeed have a getID() that returns the vehicleID field

#

movingObjects have their getID that returns object's field of 'ID'

#

they don't inherit or interact

faint jewel
#

i see that lol.

#
 local objects = square:getMovingObjects()
          for index = 0, objects:size() - 1 do
            local obj = objects:get(index)
            if obj:getObjectName() == "Vehicle" then
              print("Vehicle found! name: " .. obj:getObjectName() .. " - ID: " .. obj:getID())
              if obj:getID() == pMod.TrailerId then
                print("vehicle has the same id as players trailer: " .. pMod.job)
                return true
              end
            end
          end
#

that's my goal.

sour island
#

you can pull field data directly

#
--TODO: Figure out how to get this to work outside of debug

    for i = 0, getNumClassFields(zombie) - 1 do
        ---@type Field
        local javaField = getClassField(zombie, i)
        if javaField then
            if luautils.stringEnds(tostring(javaField), '.' .. "speedType") then
                print("-EHE:SWH: javaField: "..tostring(javaField))
                if not javaField.setInt then
                    print("-EHE:SWH: setZombieSpeed: ERROR: javaField.setInt not found.")
                    return
                else
                    javaField:setInt(zombie,speedVal)
                end
            end
        end
    end
#

can't set tho, also this is junk code from my github history - not usable as is

faint jewel
#

I was gonna say.

#

and i dont want to set it, just wanna verify it against the one i stuff in the players mod data.

sour island
#

alternative: use

    public String getAuthorizationDescription() {
        return String.format("vid:%s(%d) pid:(%d) auth=%s static=%b active=%b", this.scriptName, this.VehicleID, this.netPlayerId, this.netPlayerAuthorization.name(), this.isStatic, this.isActive);
    }
#

and string manipulate to get the ID

faint jewel
#

uhhhh.....k

sour island
#
local function cutMyClassIntoPieces(object,fieldID)
  for i = 0, getNumClassFields(object) - 1 do
    local javaField = getClassField(object, i)
    if javaField and luautils.stringEnds(tostring(javaField), '.' .. fieldID) then
      print("-javaField: "..tostring(javaField)..tostring(javaField:get(object)))
      return javaField:get(object)
    end
  end
end
faint jewel
#

nice name

sour island
#
local ID = tonumber(vehicle:getAuthorizationDescription():match("%((.*)%) pid:%("))
#

should probably confirm the string's return before trying to force tonumber

#

incase the field stuff doesn't work

#

the fieldID you need is 'VehicleID' btw

winter thunder
#

is there a specific size that the preview image for mods should be?

#

Like, the basic one that just shows up in game

sour island
#

512x512 I guess

#

half that for steam

radiant ginkgo
faint jewel
#

grrrr

#
          for i=0,square:getMovingObjects():size()-1 do
            if instanceof(square:getMovingObjects():get(i), "BaseVehicle") then
                print("Will this work? ID: " .. square:getMovingObjects():get(i):getID())
            end
          end
``` so this is a LOT cleaner for getting the base id's.
sour island
#

that gets vehicleID?

faint jewel
#

nah, still the object id's

#

just cleaner at it XD

sour island
#

did you have any luck with either method?

#

also

#
local sqObjects = square:getMovingObjects()
for i=0,sqObjects:size()-1 do
    local vehicle = sqObjects:get(i)
    if vehicle and instanceof(vehicle, "BaseVehicle") then
        local vID = tonumber(vehicle:getAuthorizationDescription():match("%((.*)%) pid:%("))
        print("Will this work? ID:" .. vehicle:getID().." vID:"..vID)
    end
end```
#

while probably not a big deal, it is good form to not make repeated calls if you don't have to

faint jewel
#

lol probably not.

sour island
#

try that for the vehicle ID

faint jewel
#

okay

robust jetty
#

any idea how to add a inventory page with a exact copy of main inventory?
i have this```
local private = {}
private.refreshBackpacks = ISInventoryPage.refreshBackpacks

function refreshBackpacks()
private.refreshBackpacks(self)

end

faint jewel
#

not QUITE lol

robust jetty
#

I think this line of code is what makes the inventory work

sour island
#
local private = {}
private.refreshBackpacks = ISInventoryPage.refreshBackpacks
function ISInventoryPage:refreshBackpacks()
    private.refreshBackpacks(self)
end

Probably not an answer, but I noticed you didn't overwrite ISInventoryPage . refreshBackpacks

faint jewel
#

I need a isoMovingObjects():BaseVehicle():getID(); LOL

sour island
#

that is the vehicle ID

#

what are you adding as trailerID?

faint jewel
#
    local carid = car:getID()
#

all this because vehicles can't have moddata ugh

sour island
#

vehicles can have modData, anon said

sour island
faint jewel
sour island
faint jewel
#

because getMOddata on a vheicle causes hell because the vehicle HAS no moddata

sour island
#

wait, getID() doesn't return the same number?

faint jewel
#

that's the trailer id on the rgiht in my img

sour island
#

was that set in that session, or an earlier one

#

I have a feeling objectIDs don't get saved

#

it's probably a reference ID on load

faint jewel
#

same

sour island
#

Have you tried using modData?

faint jewel
#

yes days ago

#

getModdata() on a vehicle bombs

sour island
#

what happens?

#

heh, I accidentally created a new feature

#

I can store XP into journals but reading them doesn't give me the XP as gained for transcribing

faint jewel
#

it says getmoddata is nil

#

and aitreron said that there is no vehicle modata which is why it doesn;'t show in AUD

sour island
#

?

bronze yoke
#

i use it also

dull moss
#

mr albion

sour island
#

it's an isoObject - although that doesnt stop zombies from not saving theirs

dull moss
#

remember the function you came up with to overwrite base game traits

bronze yoke
#

it's mrs albion

#

but yeah?

dull moss
#

my bad

#
local altNames = {}
altNames.Gardener = getTextOrNull('UI_trait_GardenerMarked');
local old_addTrait = TraitFactory.addTrait
    
function TraitFactory.addTrait(type, name, ...)
    name = altNames[type] or name
    return old_addTrait(type, name, ...)
end```
#

this one

#

How can I tweak it to overwrite more values?

#

aka for example i want to make trait not profession-specific, or hide some trait from character selection

#

would I have to provide all fields then?

astral dune
# sour island ?

albion writes to vehicle modData and I write to modData on installed vehicle parts, both work fine

bronze yoke
#

you can provide more fields, i used ... because i wasn't sure how exactly it would interact with variable numbers of arguments

dull moss
#

gotcha

#

cheers

#

10 traits away from finishing everything up

sour island
#

All the bodies of my characters during testing

#

Got another report of fileReader failing and bricking someone's server

#
"/lua/EasyConfigChuckedServerConfigs/servertest_config"
"/lua/EasyConfigChuckedServerConfigs/servertest-Copy_config"
#

The folders exist on his machine and include the config files inside with appropriate names, but the folder name is /Lua/ obviously.

#

Still not sure what's causing it.

faint jewel
#

MURDER THEM ALL!

dull moss
sour island
#

: java.nio.file.NoSuchFileException: /lua/EasyConfigChuckedServerConfigs/servertest-Copy_config
: at jdk.zipfs/jdk.nio.zipfs.ZipFileSystem.deleteFile(Unknown Source)
: at jdk.zipfs/jdk.nio.zipfs.ZipPath.delete(Unknown Source)
: at jdk.zipfs/jdk.nio.zipfs.ZipFileSystemProvider.delete(Unknown Source)
: at java.base/java.nio.file.Files.delete(Unknown Source)
: at zombie.core.logger.ZipLogs.deleteDirectory(ZipLogs.java:305)
: at zombie.core.logger.ZipLogs.addDirToZipLua(ZipLogs.java:264)
: at zombie.core.logger.ZipLogs.addZipFile(ZipLogs.java:80)
: at zombie.network.CoopMaster.launchServer(CoopMaster.java:164)
: at zombie.network.CoopMaster.launchServer(CoopMaster.java:88)
: at zombie.network.CoopMaster$1.call(CoopMaster.java:396)
: at se.krka.kahlua.vm.KahluaThread.callJava(KahluaThread.java:182)
: at se.krka.kahlua.vm.KahluaThread.luaMainloop(KahluaThread.java:1007)
: at se.krka.kahlua.vm.KahluaThread.call(KahluaThread.java:163)
: at se.krka.kahlua.vm.KahluaThread.pcall(KahluaThread.java:1980)
: at se.krka.kahlua.vm.KahluaThread.pcallBoolean(KahluaThread.java:1924)
: at se.krka.kahlua.integration.LuaCaller.protectedCallBoolean(LuaCaller.java:104)
: at zombie.ui.UIElement.onMouseUp(UIElement.java:1228)
: at zombie.ui.UIElement.onMouseUp(UIElement.java:1183)
: at zombie.ui.UIElement.onMouseUp(UIElement.java:1183)
: at zombie.ui.UIManager.update(UIManager.java:816)
: at zombie.GameWindow.logic(GameWindow.java:262)
: at zombie.core.profiling.AbstractPerformanceProfileProbe.invokeAndMeasure(AbstractPerformanceProfileProbe.java:71)
: at zombie.GameWindow.frameStep(GameWindow.java:765)
: at zombie.GameWindow.run_ez(GameWindow.java:681)
: at zombie.GameWindow.mainThread(GameWindow.java:495)
: at java.base/java.lang.Thread.run(Unknown Source)

#

Any Java heads know what is happening here, on a technical level?

frank elbow
#

Does it usually have a leading slash ? I'm no Java head by any means but that part seems odd

sour island
#

I assume the bottom is the first stack? and its read upwards to the exception?

limber oar
#

Quick (easy?) question -- what format are the colors in HairOutfitDefinitions? They're set as decimals, like 0.98,0.87,0, but don't seem to map to common color-coding methods.

sour island
#

0 - 1 == 0 - 255

sour island
limber oar
sour island
#

Only seems to happen sometimes - refuses to let them boot up the server even with the mods removed.

#

The last part is the concerning bit

#

I don't think the fact the lua is capitalized matters - but I do find it weird the exception stops at the folder outermost to the file

#

Could the issue be I'm using too many folders?

#

Going to ask the user to send me his zomboid cache

#

Kind of confused why delete is being called ๐Ÿค”

frank elbow
#

Based on the stack trace and a quick peek at the code, it seems like ZipLogs creates a new file system object while creating the zip, and deletes the lua directory before re-creating it (as a sanity check, I suppose)

#

I'm not sure why this is being called from onMouseUp, though

sour island
#

I believe this occurs when they hit to launch the server

frank elbow
#

From the Host option?

sour island
#

Yes, they're hosting from the main menu

frank elbow
#

Ohh, that makes sense

sour island
#

Not sure what to do when the error occurs even when my mods aren't installed.

#

Asked the guy to manually delete the files and it fixed the issue.

#

๐Ÿคทโ€โ™‚๏ธ Another can kicked down the road I suppose

#

Based on '/lua/' I'm assuming it is trying to delete '/Lua/' and can't rectify it

#

Nothing else in the string is lowercased - but I'm still wondering why it was flagged to be deleted ๐Ÿค”

#

and why it was so insistent

sour island
#

I could drop the folders entirely and write into a file right in Lua

#

I suppose that should fix the issue(??)

faint jewel
#

hmmmmmmmm

#

apparently it IS setting the mod data of the trailer.

#

but i don't know how to GETthat trailer and check it's mod data still.

#

FFFFFFFFFFFFFFF

sour island
#

I thought you got all the vehicles in the area?

faint jewel
#

i get all the moving objects.

sour island
#

and you can tell which are vehicles? and trailers are vehicles? and can have modData?

faint jewel
#

they have a type yeah

#

okay so 1. yes. 2. yes. 3. apparently, yes?

sour island
#

I don't see how you can't find the vehicle you want?

faint jewel
#

because my brain hurts

#

this is why i do art lol.

astral dune
#

If this is clientside you can pull a list of all the loaded vehicles and loop through it. Or if whatever you're doing relies on you interacting with the vehicle you can get the vehicles in a particular cell you click on, lots of options

sour island
#

I've just spent like 30 minutes trying to figure out that nil ~= false

#

so, I think we're in the same boat

astral dune
#

haha it can be quite hard to explain to people that nil is false but not equal to false

faint jewel
#

Anon, I need to know if a certain vehicle with a certain moddata is within 10 tiles of a certain tile.'

#

that is "the goal"

sour island
#

The sad part is I know that, I set it to ==false and changed something else which made it nil - cause before I had 'not X'

#

basically moving to many parts to get this done

sour island
#

if you can get the nearby vehicles fine you can just parse for that one

faint jewel
#

already have

astral dune
faint jewel
#

theorhetically i know both.

#

the player and the vehicle are both branded (moddata) with the same code.

#

i just need to make surte the vehicle is in range of the tile when the player turns it in.

astral dune
#

so the vehicle is marked, but you don't have its ID on hand, is that right?

faint jewel
sour island
#

Is the code large?

faint jewel
#

huh?

sour island
#

To post here

faint jewel
#

which part would you like?

sour island
#

uh I guess the part that spits out that message

#

the pass-fail check

faint jewel
#
local function openboard()
  local player = getPlayer();
  local myModData = player:getModData();
  if (myModData.job == nil) then --If we have nothing stored in this modData then we place the microfilm and then fill in the modData           
    OTR_UI:close();
    locallistUI:close();
    JobsUI:open();   
  elseif (myModData.job ~= nil) then --If we have something in the modData then we just print console stuff and end            
    if (myModData.city == tcityName) then 
      if findTrailer() then
        -- get trailer and remove and show ui and shit.
        player:Say("turning in job! " .. myModData.job);
        JobCompleteUI:open();
        TimerUI:close();
        myModData.job = nil
      else
        player:Say("UH OH! my trailer isn't close enough to deliver! ");
      end
    else
      player:Say("I'm on a job going to " .. myModData.city); 
    end
  end 
end
#
function findTrailer()
  --detect the obj with sprite named wew
  local player = getPlayer()
  local pMod = player:getModData()
  local cell = player:getCell()
  local x, y, z = player:getX(), player:getY(), player:getZ()
  local xx, yy, zz
    for xx = -15, 15 do
      for yy = -15, 15 do
        local square = cell:getGridSquare(x + xx, y + yy, z)
        if square then
          local sqObjects = square:getObjects()
          for i=0,sqObjects:size()-1 do
              local vehicle = sqObjects:get(i)
              if vehicle and instanceof(vehicle, "BaseVehicle") then
                  local vID = tonumber(vehicle:getAuthorizationDescription():match("%((.*)%) pid:%("))
                  print("Will this work? ID:" .. vehicle:getID().." vID:"..vID)
              end
          end
--[[          local objects = square:getMovingObjects()
          for index = 0, objects:size() - 1 do
            local obj = objects:get(index)
            if obj:getObjectName() == "Vehicle" then
              print("Vehicle found! name: " .. obj:getObjectName() .. " - ID: " .. obj:getID())
              if obj:getID() == pMod.TrailerId then
                print("vehicle has the same id as players trailer: " .. pMod.job)
                return true
              end
            end
          end ]]
        end
      end
    end
end
#

i know you're gonna ask.

sour island
#

yeah lol

#

your not returning anything

faint jewel
#

well right now i'm not lol.

#

that's my issue XD

sour island
#

oh

faint jewel
#

see the commented code?

#

that's what i HAD but the id's weren't matching up.

#

hence our convo earlier;.

sour island
#

when you set trailer ID were you using vID as well?

astral dune
#

square:getVehicleContainer() will help you out a lot here

faint jewel
#

doesn't that just get the trunk?

astral dune
#

nope, returns a BaseVehicle

sour island
#

you can't assume anything based on it's function name

#

could have been around since cars were just wrecks

#

hence referring to them as containers

faint jewel
#

i hate these people.

#

lol

sour island
#

that doesnt solve the issue though

#

is your trailer ID the object:getID or the vehicleID

#

also were we able to confirm either is consistent?

faint jewel
#

well it had moddata attached (i hope)

sour island
#

if you store a temporary value there's no way to compare it later

faint jewel
#
Commands.KYRPT.spawnTrailer = function(player, args)
    local pX, pY, pZ = args.x, args.y, args.z
    local serverFixAngle = args.dir
    local gCode = args.code;
    
    local sq = getCell():getGridSquare(pX, pY, pZ)
    local car = addVehicleDebug(args.type, args.dir, nil, sq)
    local carModData = car:getModData(); 
    carModData.job = args.gCode;
    local carid = car:getID()
    car:transmitModData()
    sendServerCommand("KYRPT", "getTrailer", {trailer = carid, code = gCode});    
    local FixAngle = IsoDirectionsToAngles[serverFixAngle] or 0
    car:setAngles(180.0, FixAngle, 180.0)


    --Clear out part inventories of random items that spawn in when we spawn vehicles in. 
    if args.clear then    
        for i = 0, car:getPartCount() -1 
        do
            local part = car:getPartByIndex(i)
            local container = part:getItemContainer()
            if container then
                if container:getItems():size() ~= 0 then
                    container:removeAllItems()
                end
            end
        end
    end
    
    if (type(args.condition) == "number") then
        for i = 0, car:getPartCount() -1 
        do
            local part = car:getPartByIndex(i)
            if part:getCondition() > 0 then
                part:setCondition(args.condition)
            end
        end
    end             
end
sour island
#

But it should work within the same session

#

you're comparing vehicleID in one code to getID() in another

faint jewel
#

because i have been trying everything.

#

and it's gotten very very messy

sour island
#

local carid = car:getID()
local carid = tonumber(car:getAuthorizationDescription():match("%((.*)%) pid:%("))

#

But, I don't know if objectID or vehicleID are constant

astral dune
#

getId and getID don't return the same thing, lol, getId is the one that is specific to the vehicle, and its still no good because it can change between loads

sour island
#

wait are they spelled differently

astral dune
#

getSqlId is the only one that is consistent across loads and server vs client, but there is no way that I know of to retrieve a vehicle by that Id, so you have to search through vehicles and check each's sqlID

sour island
#

I'll be damned

faint jewel
#

does moddata stay though?

astral dune
#

ya for sure

faint jewel
#

well i have mod data on the trailer (i guess i have NO way to tell and AUD doesn't show me.)

astral dune
#

but if you're applying the moddata on the client I'm pretty sure you have to manually sync it with the server

faint jewel
#

it's set on the server.

#

that last block of code is the server command to sapwn the car.

drifting ore
#

Any modders that could help me with a little script for my new video? ๐Ÿ‘‰ ๐Ÿ‘ˆ

sour island
#

to ask the server to check it's side

faint jewel
#

i trasmit it though

sour island
#

but if you're hosting/SP I don't think the modData's would mnismatch

faint jewel
#

car:transmitModData()

#

erma gerd

sour island
#

I was mistaken regarding transmit

sour island
faint jewel
#

i looked up examples of square:getVehicleContainer

#

local vehicle = square:getVehicleContainer() == "Is there a vehicle in this square"

astral dune
#

well ya, if it returns a vehicle then there must be a vehicle, lol

faint jewel
#

local vMod = vehicle:getModData()

#

le SIGH

astral dune
#

?

faint jewel
#

empty table.

#

it was added and transmitted ๐Ÿ˜ฆ

#

server.lua```lua
local car = addVehicleDebug(args.type, args.dir, nil, sq)
local carModData = car:getModData();
carModData.job = args.gCode;
car:transmitModData()

#

client.lu```lua
function findTrailer()
--detect the obj with sprite named wew
local player = getPlayer()
local pMod = player:getModData()
local cell = player:getCell()
local x, y, z = player:getX(), player:getY(), player:getZ()
local xx, yy, zz
for xx = -15, 15 do
for yy = -15, 15 do
local square = cell:getGridSquare(x + xx, y + yy, z)
if square then
local vehicle = square:getVehicleContainer()
if vehicle ~= nil then
print("and we got a car...")
local vMod = vehicle:getModData()
print(vMod.job)
if vMod.job == pMod.job then
print("oh jesus we found it!")
return true
end
end
end
end
end
end

#

vmod.job is nil.

astral dune
#

shouldn't it be vmod.gCode.job?

faint jewel
#

?

astral dune
#

you didn't put a job key into the moddata on the server in the snippet

#

so why would there be a job key on the client?

faint jewel
#

carModData.job = args.gCode;

astral dune
#

ah, whoops

faint jewel
#

it gets all the cards... but returns NADA for the mod data.

astral dune
#

so either args.gCode is nil, or transmitModData doesn't work, although chuck seemed to just check the latter and it worked

faint jewel
#

it sets it on the player when it sets it on the trailer.

#

i wish someone would update AUD to work with vehicle mod data lol.

sour island
faint jewel
#

now you see hy my brain... is pudding.

sour island
#

this is on SP?

faint jewel
#

MP, it's for a RP server.

sour island
#

your testing this on MP?

faint jewel
#

.....yes?

sour island
#

try it in SP

#

if it works fine - as it should given you're dealing with the same modData with nothing to transmit - then the issue is with transmitting

#

what you can do is change the sign interaction to happen on the serverside

#

this could solve a few issues as the text can now appear for all players ๐Ÿคทโ€โ™‚๏ธ

#

that being said, not being able to transmitModData is weird

#

you could also try to set all the modData on the client's side

#

given it's a mission type system - other players don't really need to know that info

#

this is also why I've been putting off fixing EHE's networking issue

faint jewel
#

okay. i think i know what to do ... lemme rewrite some crap.

sour island
#

stick with it, you're like 90% there

#

I also need to stick with it, journals and XP math suck ass

faint jewel
#
Commands.KYRPT.getTrailer = function(args)
  print("it Fired and vehicle");
  local square = args.tloc;
  local gCode = args.code;
  local vehicle = square:getVehicleContainer();
  local vMod = vehicle:getModData();
  vMod.job = gCode;
end
``` client side command sent from the server when the server creates the trailer.
#

sendServerCommand("KYRPT", "getTrailer", {tloc = sq, code = gCode});

#

wait wait... wen you say MPO, does that mean hosting, or a dedicated server that can eat my ass as it will never launch?

sour island
#

either

#

if it's in the multiplayer mode your server and client entities need to be told to communicate

faint jewel
#

WELP

#

sending a square is a no no.

astral dune
#

tables, strings and numbers only afaik

sour island
#

you can send a table of x,y,z to compare

dull moss
#

how can i access this wonderful tool

faint jewel
#

AUD

#

i need that updated to show vehicle mod data lol.

dull moss
#

aud?

sour island
#

there's a few things it could do with - overall solid tool

dapper geode
#

Hii just curious, is there any way to remove some items from the game safely? Or should I takeout the items manually from the scripts file?,

faint jewel
#

FFFFFFFFFFFFFFFFFFFFFFF

quasi geode
dull moss
faint jewel
#

AUD is a zomboid mod

dull moss
#

oh

sour island
dull moss
#

beautiful thx

#

no more 1000 prints

sour island
#

perhaps sprucing that up can be on the agenda for the community patch

#

putting all the tools in the same toolbox so to speak

#

speaking of which - I was supposed to roll that out today ๐Ÿ˜ฆ

astral dune
sour island
#

perhaps I am free from this purgatory

faint jewel
#

oooooh

sour island
#

seems to be working

#

I kept getting stuck on the fact reading journals gave XP

#

initially I had it blocked but that made journals one way - as in you couldn't pass it onto a new journal

#

kept trying to go back and forth when the answer was to do both

#

rely on it getting blocked and feed the information manually during reading

#

I wonder if I should leave that in as a sandbox option

#

basically locking the XP to the journal so you can't make more

thick karma
#

Anyone happen to know what determines the degree of darkness on squares you cannot see (as in through walls, through trees, etc.)?

quasi geode
faint jewel
#
Commands.KYRPT.getTrailer = function(args)
  print("it Fired and vehicle");
  local pX, pY, pZ = args.tX, args.tY, args.tZ
  local square = getCell():getGridSquare(pX, pY, pZ)
  local gCode = args.code;
  local vehicle = square:getVehicleContainer();
  local vMod = vehicle:getModData();
  vMod.job = gCode;
end
``` this returns nil for vehicle.
astral dune
#

how do you know there was a vehicle in the square?

faint jewel
#
   local pX, pY, pZ = args.x, args.y, args.z
    local serverFixAngle = args.dir
    local gCode = args.code;
    
    local sq = getCell():getGridSquare(pX, pY, pZ)
    local car = addVehicleDebug(args.type, args.dir, nil, sq)
    local carModData = car:getModData(); 
    carModData.job = args.gCode;
    car:transmitModData()
    sendServerCommand("KYRPT", "getTrailer", {tX = pX, tY = pY, tZ = pZ, code = gCode});  
#

becuase it spawned the trailer there.

astral dune
#

if you spawned the vehicle, then just send its id and use getVehicleById on the other side, much easier than trying to search for it again

faint jewel
#

๐Ÿ˜

#

use what now?

astral dune
#

lol oh man

sour island
#

I think you missed it Skiz, but isoObject:getID BaseVehicle:getId

#

not the same, you could've used it this whole time

#

and there's also a getVehicleById()

faint jewel
#

didn't you say those changed though?

astral dune
#

only after server has been rebooted

#

if you're sending a command right away after creating the vehicle, it will definitely be the same id

faint jewel
#

okay so that second set ofcode..

#
    local CarID = DOWHATHERE;
    car:transmitModData()
    sendServerCommand("KYRPT", "getTrailer", {id = CarID, code = gCode});  
astral dune
#

local CarID = car:getId()

faint jewel
#
Commands.KYRPT.getTrailer = function(args)
  print("it Fired and vehicle");
  local gCode = args.code;
  local car = getVehicleById(args.id)
  local vMod = car:getModData();
  vMod.job = gCode;
end
``` and this should grab it ?
astral dune
#

yep

sour island
#

I don't think my idea for tracking TV XP is going to work

#

but I can atleast block it from being transcribable

faint jewel
#

car is nil

astral dune
#

you didn't happen to use car:getID() instead, did you?

faint jewel
#
Commands.KYRPT.getTrailer = function(args)
  print("id: " .. tostring(args.id) .. " and code: " .. tostring(args.code));
  local gCode = args.code;
  local car = getVehicleById(args.id)
  local vMod = car:getModData();
  vMod.job = gCode;
end
#

Commands.KYRPT.spawnTrailer = function(player, args)
    local pX, pY, pZ = args.x, args.y, args.z
    local serverFixAngle = args.dir
    local gCode = args.code;
    
    local sq = getCell():getGridSquare(pX, pY, pZ)
    local car = addVehicleDebug(args.type, args.dir, nil, sq)
    local carModData = car:getModData(); 
    carModData.job = args.gCode;
    local CarID = car:getId();
    car:transmitModData()
    sendServerCommand("KYRPT", "getTrailer", {id = CarID, code = gCode});  
    local FixAngle = IsoDirectionsToAngles[serverFixAngle] or 0
    car:setAngles(180.0, FixAngle, 180.0)


    --Clear out part inventories of random items that spawn in when we spawn vehicles in. 
    if args.clear then    
        for i = 0, car:getPartCount() -1 
        do
            local part = car:getPartByIndex(i)
            local container = part:getItemContainer()
            if container then
                if container:getItems():size() ~= 0 then
                    container:removeAllItems()
                end
            end
        end
    end
    
    if (type(args.condition) == "number") then
        for i = 0, car:getPartCount() -1 
        do
            local part = car:getPartByIndex(i)
            if part:getCondition() > 0 then
                part:setCondition(args.condition)
            end
        end
    end             
end
#
LOG  : General     , 1672371264991> 87,130,843> id: 255 and code: load7.6561197979283824E16```
#

that's what the log prints.

#

but the car is nil.

#

i wonder.

#

dammit no..

tawdry solar
#

if i wanna update my mod does it auto update

faint jewel
#

yes

tawdry solar
#

when i change files

#

thats cool

faint jewel
#

there is a voice in my head screaming at high decibels ๐Ÿ˜ฆ

tawdry solar
#

alr

#

so i changed my mods name and stuff

#

and its not workin

faint jewel
#

that WONT work

#

yoiu can change stuff IN it.

tawdry solar
#

oh

faint jewel
#

but not the whole ass mod info.

tawdry solar
#

i have to do that in steam workshop

faint jewel
#

that's a new mod then.

tawdry solar
#

what

#

will it break the mod then

#

i have seen people do it before

faint jewel
#

what are you wanting to do?

tawdry solar
#

change the name and add more content

#

im not changing the id or anyth

faint jewel
#

now are you doing this in your LOCAL folder, your WORKSHOP folder, or the STEAMAPPS folder.

tawdry solar
#

steam wrkshop

#

it works

finite owl
#

@faint jewel Just to elaborate a bit on the whole vehicle IDs changing thing (if you end up using getVehicleById()) - how it seems to work is that a vehicle gets given a new ID when it's loaded into memory. With RV Interior, since it teleports the player far across the map into the interior map, I can see that the vehicle ID of the vehicle they entered is different when they're teleported back to be next to it again. So, I believe vehicle IDs are useful for client/server interactions, where the vehicle is in memory and the client can use it to say "that vehicle", but once the vehicle is unloaded from the server's memory for whatever reason, the old vehicle ID won't be valid and won't (necessarily) match the ID assigned to the same vehicle when it's next loaded up again.

#

Not really relevant to your problems right now, but I thought it was worth sharing how it seems to work.

faint jewel
#

I am losing my damned mind.

astral dune
#

I wonder if creating a vehicle with the debug command doesn't sync the ID's properly

finite owl
#

What, the Spawn vehicle UI? That hasn't caused any problems when testing the RV Interior code in (locally hosted) MP...

astral dune
#

does it use the addVehicleDebug function that he is using?

faint jewel
#

local car = addVehicleDebug(args.type, args.dir, nil, sq)

brave pier
#

Does anyone know what might be causing the two pixel wide line to appear on the south facing poster?

faint jewel
#

move them 1 pixel in

#

each side i mean.

brave pier
#

Then they would be on top of each other with missing line

#

The red line is end of first half, blue is second half of the image

tranquil reef
#

Is there something blatantly obvious I'm missing here lol

#

The item works, it's in my inventory with the icon and name, but the model just doesn't show up. I can place it on the ground, but it just has no physical model for some reason

#

there is 100% a "models_X/WorldItems/Figure_Tank.fbx", so that's probably not the problem

#

Tried upping the scale and restarting two times, first was 10, then 100, still doesn't show

finite owl
iron bridge
tranquil reef
tranquil reef
#

Unless by "error" you meant actual debug log error, then, noGaben

ancient grail
#

is there a way to get all known/spawned vehicle in the world

humble oriole
#

What is the is/set/getToxic for IsoBuildings?

faint jewel
#

so apparently... getvehiclebyid, only works right on the server side.

bronze yoke
humble oriole
thick karma
faint jewel
#

is there an easy way to remove a vehicle permanently?

ancient grail
#

Despawn em

faint jewel
#

i am trying. they just come right back.

#

fffffffffffffffffffffffffffff

#

vehicle:removeFromWorld() - nope
vehicle:permanentlyRemove() - nope
vehicle:Destroy() - CRASH.

ancient grail
#

Look for the code related to admin context menu despawn u might find it there
Ill send it to you when i get back

faint jewel
#

i already did.

#
        sendClientCommand(playerObj, "vehicle", "remove", { vehicle = vehicle:getId() })
    else
        vehicle:permanentlyRemove()
    end```
ancient grail
#

Cool

#

Goodjob man

drifting ore
#

is there a way to make a placed trap occupy 50x50 area so other traps can't be placed there?

sour island
#

You'd have to scan the area when you place the trap

#

Or keep track of placed traps

fast galleon
#

if you place a moveable object, other objects can't be placed? So it should work by default

sour island
#

I think he wants a 50x50 range to the block

#

I can foresee issues with the scan and unloaded squares - but 50x50 should be within the scope

fast galleon
#

he says he wants his trap to be that size, sure it's abnormally big but if it blocks the square that's enough

sour island
#

I ... could be wrong, but I think he means he wants the trap to prevent other traps within a 50x50 area from being placed

#

Now that I reread his statement, I'm not sure lol

twin hawk
#

anyone know a mod that lets me have runners? like joggers not full on out sprinters

robust jetty
#

Difference between IsoGameCharacter and ILuaGameCharacter?

#

One is java and the other one is Lua?

sour island
#

it's an interface - the game recognizes IsoGameCharacter for modding purposes

robust jetty
#

So ILua for interface and stats, and ISO for animations and things like that?

sour island
#

@finite radish were you the one that mentioned they had something parsing changes to the java?

sour island
#

I wouldn't use it / think about it

finite radish
#

IsoGameCharacter implements ILuaGameCharacter, and even if you wanted to use it directly it wouldn't make any sense unless it's a static function (and I doubt it has any members that are)

sour island
#

doesnt seem to be used that much eitherway

finite radish
sour island
#

I recall someone saying they had made something (github maybe?) that showed differences in decompiled code

finite radish
#

I think that was DeltaMango, in the mapping discord

#

(if it wasn't, he has something similar I'm fairly certain)

sour island
#

ah ty

#

setting up a community patch repo - has the ability to upload to workshop from github

#

figured being able to tell changes made would come in handy

finite radish
#

interfaces are just guidelines on what a class needs to implement functionality for though, to allow compatibility between classes. not sure why that's the case for this but I'm sure it exists for a reason

#

the actual implementation/functionality of the members is implemented on the class itself though

#

(that's why using ILuaGameCharacter by itself isn't even really possible - none of the functions/members actually do anything until their implementation is defined by a class)

sour island
#

I mistook the fact it's sparsely referenced as to mean it's not used

#

Currently gathering some 'issues' that can be addressed by whomever.

#

also @tame mulch Would it be alright if AUD got an update/used as a base under this?

robust jetty
#

Bro.... getBrain() gives nil

#

Sad

finite radish
#

relatable

smoky meadow
#

you want to create guns or melee weapons?

#

https://youtu.be/2M2fWLBLaX8 i learn making gun mod by this guy. he's my virtual sensei eheheh

0:00 Intro
0:29 Video Start
1:00 Start Blender
1:22 Using a background image
2:04 Using photoshop to edit the background image
2:52 Adding the edited background image to blender
3:26 Adding the cube mesh
3:46 Quick start with the cube
4:56 Importing a finished 3d Model from the internet
5:56 Moding the imported model
6:47 ADD NOTE ABOUT MAGAZIN...

โ–ถ Play video
ancient grail
brave pier
#

Does anyone know what might be causing the two pixel wide line to appear on the south facing poster? It is not short as the two images meet at red and blue lines

ancient grail
#

Like if i for example
Do a command

getPlayer():getInventory():Additem("Base.Apple")

It will then print

Command executed:
getPlayer():getInventory():Additem("Base.Apple")

#

Not sure this is possible

bronze yoke
#

you want it to print every single piece of code that runs?

sour island
#

it is possible if I overwrite the functions but, yeaaah, lmao that'd make the log unreadable

ancient grail
#

Is itnpossible?

#

Maybe not print it

#

Have a ui that shows it?

sour island
#

this would effectively be like adding a print after each if()

#

I don't think it would have a wide range of use outside of a last resort

#

I could make printing easier

#

print fingerprint shows the mod it comes from but it could also include the function and line

#

it uses the same info that error mag does

#

I just clip the text

ancient grail
#

Just a suggestion
.an idea that would simplify learning as we can see whatever stuff is being run. I doubt its possibe tho but maybe it is for u idk

sour island
#

you could have it just be print(var) and it would say what function it's coming out of

ancient grail
#

Thats an alternative or maybe return all funxtions with that var

sour island
#

I get what you mean - but if we use your example - if the item doesnt appear and the modder cant tell why - they can just start adding in prints along the way

#

I'll think about it - unless someone else sees the merits and wants to do it

ancient grail
#

๐Ÿ™

sour island
#

I do think having a debugPrint() that doesnt require much fussing to get a clear message might be a good idea

bronze yoke
#

yeah i like that

robust jetty
#

x2

#

I'm going crazy trying to understand how to add a simple button

#

Still trying to understand and learn how everything works

sour island
#

anyone familiar with hashmaps know if it's possible to check if it has a value over a certain value?

#

I need to see if a player has a xpboost over 0 - but I dont want to parse each skill

#

it's for a tooltip...

#

maybe I can add it on oncreate

ancient grail
#

Another idea if i may

For example

getPlayer():getUserName()
getPlayer():getSteamId()
getPlayer():getStats()

Of we could

printOptions(getPlayer())

And then prints out all the available stuff that is followed by getPlayer()

It would be hell alot easy doing research while on debug

sour island
#

intelliJ does that tho

ancient grail
#

Esp if it we are dealing with like for example bodyparts
That shit is confusing to deal with
Or moodle
Maybe
Not sure if its possible again

bronze yoke
#

you can do that - not sure how it's better than just reading the javadoc though

ancient grail
#

I tried it it doesnt show everything tho or maybe my installtion lacks stuff

sour island
#

Did you add the library files as libraries?

fast galleon
#

tyrir already posted a print like that

sour island
ancient grail
bronze yoke
#

i've noticed my copy of the libraries doesn't really seem to understand inheritance

sour island
#

it doesn't

#

one of the things that bothers me

fast galleon
sour island
#

I'm also not capable enough to make those kinds of changes

bronze yoke
#

yeah... i tried to mess around with it but all that gradle stuff is a nightmare

sour island
#

atleast not automatically

ancient grail
sour island
#

the tutorial konijima wrote is straight forward tho

fast galleon
#

you're gonna have to search I guess

sour island
#

if you don't see what I posted you should try again

ancient grail
# sour island atleast not automatically

Well if the suggestion isnt worth it then toss it. Im jist thinking of stuff that might be usefull comming from my experience which i think would be lot useful

sour island
#

I was talking about the gradle stuff there

#

right now the librariers can't tell isoPlayer comes from isoGameCharacter

ancient grail
#

Ow un mentioned aud
I made my own patch of it thats not uploaded on the workshop
Its just sonething i use while modding

sour island
#

You can define it using emmyLua typing tho

#

it's just a headache if you're not familiar with the class

sour island
#

There's a few things related to the UI that are busted

ancient grail
#

Speaking of iso player

Sorry kind of off topic
Do i need to send to server for these types of code to work

        for i=0, getOnlinePlayers():size()-1 do
            local chr = getSpecificPlayer(i)
            chr:Say(restartMsg) 
            getSoundManager():PlayWorldSound('SOStagline', chr:getSquare(), 0, 5, 5, false) 
            addSound(chr, chr:getX(), chr:getY(), chr:getZ(), 5, 1)
            end
sour island
#

being I dont think he killed his character 40 times in a row to test something ๐Ÿ˜…

ancient grail
#

But ill check the hordenight mod i think it does this .. i havent checked it .

sour island
#

MP say?

#

sounds should play fine for connected clients

#

as long as you dont move the emitter around

#

^ why EHE is currently janky with MP sounds

sour island
#

if the process is initiated by a client you need to use a command to tell the server to do it's side of things

#
local function flagPlayerWithBoostedXP(id, player)
    local pMD = player:getModData()
    if pMD.bBoostedXP then return end

    local pXP = player:getXp()
    local boosted

    for i=1, Perks.getMaxIndex()-1 do
        ---@type PerkFactory.Perk
        local perk = Perks.fromIndex(i)
        boosted = boosted or pXP:getPerkBoost(perk)>0 or nil
    end
    
    pMD.bBoostedXP = boosted or false
end
Events.OnCreatePlayer.Add(flagPlayerWithBoostedXP)
#

This should catch only positive cases until the end and return a caught positive or false right?

#

I need to sit down with the lua test bed and refresh how true/false handle with nots

bronze yoke
#

it looks good to me

sour island
#

or nil is redundant I think?

#

as is the final or false(?)

bronze yoke
#

yeah, you're turning it to nil and then to false again

#

but the logic is fine, it will work as far as i can see

sour island
#

I swear I run into issues with false/true

finite radish
#

wat

#

it's either "yes" or "no" more or less

#

what kind of issues KEKW

sour island
#

Idk if it's kahlua related but once and a while I'll have to write out ==true or ==false cause 'if X then' somehow confuses false for true

#

I assume it's thinking 'well false is something'

#

doesnt seem to occur with the lua.org test bed

#

last time it was sandboxvars.

#

oh you know what - I think the issue was cause on-going saves get nil sandbox vars

#

so if you're trying to check against assumed default values you could run into issues

finite radish
#

it should also be noted that 0 returns true, unlike a lot of languages

sour island
#

i.e.: the default value is true and you are using 'if not X then' - if you added the option after the fact it will come up as nil, and thus false

bronze yoke
#

oh i had no idea...

#

that's actually pretty annoying, luckily i haven't had to deal with that yet

sour island
#

that flew under my radar a bit while trying to debug the journals

bronze yoke
#

i'm sure i've written a lot of code vulnerable to that

sour island
#

I'm sure it's the cause to alot of my bug reports too

finite radish
#

i wouldn't be surprised if some of the times were Kahlua issues though too tbh, that library is dead as fuck and extremely old

sour island
#

Nothing beats adding a new require to an existing mod tho

#

Servers will just load right up and disable the mod with no warning ๐Ÿ˜ญ

#

all my items are gone, even when I added the other mod

bronze yoke
#

pz and the steam workshop are really working hard to make me hate using dependencies as much as possible

sour island
#

I wish there was a better way to suggest a feature than just make a thread

#

they need to allow other contributors to upload

#

working in a large group is grossly shit

bronze yoke
#

everything just gets so messy

sour island
#

github helps - but you have to rely on 1 uploader

#

one of the dream features for the community patch account is if they allow other contributors to upload - people could theoretically just add it as a contributor and we could have a template repo using the same hidden secrets for account info

#

so they keep the mod under their name - especially useful for on-going mods

#

but they can have a repo push updates from other authorized users

finite radish
#

do you mean workshop? because github allows for what you're describing. I assume you mean the former but just making sure

sour island
#

I know, and yes

#

the issue is github actions require 2FA to be disabled

#

unless you spoof it using one of those shady authenticator spoofers

#

Dummy steam acc with nothing to steal

#

no 2FA

finite radish
#

github actions, like the automated macro stuff? haven't used those before, that sounds annoying

sour island
#

the issue is steam I think

#

you can't authorize github for 2FA afaik

bronze yoke
#

steam could fix most of our issues

finite radish
#

i wonder if you could upload via steamcmd

sour island
sour island
#

apparently you can upload using steamCMD - what exactly is steamCMD?

finite radish
#

it's what's used to actually retrieve workshop addons and a bunch of other stuff using the appid

#

it's the commandline version of steam more or less

sour island
#

ah

#

it's probably abit similar to the github action script then

#

on:
  # Trigger the workflow on push or pull request,
  # but only for the main branch
  push:
    branches:
      - main

jobs:
  upload:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: AnarkisGaming/workshop@v1
        with:
          appID: 108600
          #publishedFileID -- workshop ID
          publishedFileID: 2909488957
          #changelog: 'log of changes'
        env:
          STEAM_ACCOUNT_NAME: ${{ secrets.STEAM_USERNAME }}
          STEAM_PASSWORD: ${{ secrets.STEAM_PASSWORD  }}

      # Runs a set of commands using the runners shell
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.
#

I need to figure out how to generate a change list based on commits (ideally from their description) tho

#

pulled from an ARMA2 github action tutorial

finite radish
#

i think the issue is that I'm pretty sure the upload process varies by how the game implements workshop

#

but I could be wrong on that

#

but either way if you wanna try it out, steamCMD is definitely the place to start

sour island
#

afaik the issue is steam only allows authors to upload

#

so I don't think the approach would resolve the issue

#

but I wouldn't recommend seeding your 2FA

#

I'll have to look into steamCMD

finite radish
#

why would you need multiple authors to upload if you have a git repo?

sour island
#

I mean uploading to workshop - can only come from 1 author

#

so the github action's secrets needs to be of the author account - to clarify

#

anyone can comit changes to the repo and with proper permission run that action

#

changed some terminology to clarify between workshop and github

#

I am collaborating on a mod and I have been added as a Contributor. I have a copy of their code in the Ark Dev Kit and I have been able to edit it. But how do I now upload it to Steam as an update to their mod? When I have tried via the โ€œSteam Uploadโ€ button it seems to create a new mod with a distinct mod ID. I requested a copy of their mod.db file and tried that, but I get an authentication error from steamcmd.

#

Seems as though steamCMD has the same issue/restriction

#

I don't think steam considered teams/groups for the workshop

finite radish
# sour island I mean uploading to workshop - can only come from 1 author

right, but I'm saying that's not really an issue - you have github for collaboration, and steam for releases. I don't know why multiple people would need to push a release build. major github repos rarely work outside of that either - usually release tags are handled either automatically or by a single individual (and certainly not multiple individuals at once)

#

your bleeding edge shouldn't be pushed to steam anyways, that's bad practice

sour island
#

I wasn't suggesting that - if your referring to the 'dream feature' portion - it was to include older mods into a community update process

#

right now the only option regardless if you use github or not is to reupload a new mod

#

that's where authorizing multiple authors on workshop would come into play -- as they would just have to add the modComm account

finite radish
#

how so? do you mean in terms of needing to reupload the whole thing each time? I guess that's an issue if your internet is slow

sour island
#

I feel like we're misunderstanding eachother

#

in order to update a mod through github it requires an item-author level account on the workshop

#

this requires 2FA to be disabled

drifting stump
sour island
#

if a mod author wants to opt into this to allow the community at large to keep uploading their older mod they'd have to put their personal account at risk

#

Steam allowing all contributors to upload would allow for a dummy Stem account to brunt that risk

#

without having to upload a new mod item entirely

ancient grail
drifting stump
#

yeah regardless of having github actions to push updates with a centralized account not being able to have contributers upload is terrible

robust jetty
drifting stump
finite radish
sour island
#

of course, I just hate that for the sake of posterity

finite radish
#

then don't abandon your mods ๐Ÿ˜

drifting stump
#

or you know hand over the mod to someone?

#

needing to have everyone resub to a new mod is not great

sour island
#
  • "Hey new modder, I like what you're doing - please give me ownership of that mod you're working on - I promise it's better"
ancient grail
finite radish
#

the system is the way it is now for a reason lol

sour island
#

you can just remove the contributors though?

drifting stump
#

^

sour island
#

it's this way cause the engineer at steam copy pasted the 'game guides' folder and renamed it 'workshop'

drifting stump
#

if anything at least being able to move ownership to someone else

finite radish
#

not to mention you'd have to deal with conflicts between different uploads, if they aren't coordinating between each other on github or a similar platform

#

I don't think Steam should be expected to design an entire version control system for Workshop

sour island
#

I guess, but that's another problem - if you use the analogy of a household and who can turn on the hot water - having 1 person only be able to turn on hot water makes no sense

finite radish
#

it does if you only have one faucet

sour island
#

if you let in someone to your house and they start flooding your sinks - that's kind of on you

finite radish
#

yeah, but it's also going to be on steam or the devs of the game in question - because people will start throwing a shitfit over stuff like that

sour island
finite radish
#

it's much easier to just say "this is the guy who pushes releases, if you want version control use version control software"

#

and simpler, too

#

and really not that much of an issue imo

finite radish
#

(which isn't really version control, in the modern sense)

ancient grail
#

Lets adress everyones problem abt the workshop update. I mean if a modder choose to update a mod and u happen to be a server with that mod u have to restart

Why cant it just be something like
If this servers mod is updated then update else dont

#

So that everyone can connect and not do restart

sour island
#

I don't fault steam for not wanting to sink time into this - but I think we can all agree the current process is lack luster when it comes to teams and long-term maintenance

finite radish
#

I don't see the issue personally, having worked on a couple of teams for mods on other games with workshop

ancient grail
#

Yeah but i think itsafe to say that other workshop games have this issue too... I wonder...?

finite radish
#

they don't - because most people will just do what I've been saying and use github for version control and steam for actual releases

#

it's even easier if you have a release schedule, but even without one it's perfectly fine

sour island
#

I'm not saying to not use gitHub - I actually recommend it for any sized project - team or no team

finite radish
#

absolutely

sour island
#

I assume you can make a 1-click solution for steamCMD to pull from github?

finite radish
#

git pull upstream
upload mod
done

sour island
#

yes, that's what we do for EHE

ancient grail
#

I havent actually experience restoring previous version from a github backup

finite radish
#

restoring commits is easy as cake. it really is worth it just to learn how to use github in and out though, especially via commands

#

makes everything a thousand times easier

#

pruning, merging, staging your changes properly, maintaining tags, etc.

ancient grail
bronze yoke
#

nobody's complaining about github, they're complaining about steam only allowing one single, personal account uploader making github not very useful

ancient grail
#

I mean if modders contributes to it u kight want to add like guidelines to follow?

finite radish
#

it's entirely unrelated

#

if you have a team large enough for stuff like this to matter, you should be managing your repo in a way that makes this a nonissue

#

i.e. everyone should be involved in the tagging process, so that you can determine as a team when a release needs to be pushed - then it's just on that person to push the update once it's ready. it's very simple

bronze yoke
#

what happens when that person disappears

sour island
#

the issue isn't on github's ends or the project team's

finite radish
#

or, at least, know how to hand off the project if they're going to disappear

ancient grail
sour island
#

that's not a solution lol

bronze yoke
#

we literally just saw an issue like this though that was completely unavoidable

finite radish
#

people trust some random guy with full access over X feature/repo/branch/etc. and suddenly you're waiting for months for him to come back

sour island
#

you can hand off / still run a github with out the direct owner

#

that's not nearly the same

finite radish
#

manage your projects better and you don't have to worry about that

ancient grail
#

Albion would u consider taking lead on the krp dev team?

bronze yoke
#

no

ancient grail
#

queasy ded figured u will decline

sour island
#

Glytch, gimme your mod - let it get uploaded using this other steam account

#

gimme those steam awards

ancient grail
#

Sure boss

sour island
#

trust me it's better

#

๐Ÿ‘

ancient grail
#

Hehe

#

Sent

sour island
#

Now I can decorate my steam profile with all my waifus

finite radish
#

(also for the record, in both github and steam workshop, people use accounts that are created solely for their project to manage the repo/mod/etc. that's always an option.)

ancient grail
#

I do t really care much of the awards or top listing really.. just aslong as i have a few mods that i can show to clients then thats more thn enough for me .

#

Pz mode that are public on Github helps me research while on the fly. It lacks the find feature but atleast its viewable on mobile

#

Which is why i uploaded the whole pz lua and java as a private git just for reading

bronze yoke
#

i sort of use github as a portfolio, i've used it very little for actual collaboration

sour island
#

I'm kind of worried you didn't set it up properly and you're bashing your head in trying to fix stuff

#

reminds me when I started modding and had to basically read through the classes by hand using ctrl+f

#

the shortcut in intelliJ to expand scopes is shift btw

#

shift+ctrl+f should brign up the entire project

#

you can confirm scopes at the top right - for current project only or to include all files (libraries)

#

same applies for file name searches ctrl+n and ctrl+shift+n

#

you can also lock it to file type for java

#

as the libraries muddy up the search with their lua-library counterparts

bronze yoke
#

there's file name searches...

#

i've been searching stuff like class IsoPlayer LOL

sour island
#

yeah lol

#

I was mistaken ctrl+n is class search

#

ctrl+shift+n is file

#

this actually helps with not having to change the scope or file types

finite radish
#

if you fully decomp the class files, you can search the actual code too, in every file at once. highly recommend

sour island
#

that's what the libraries do - just also makes a Lua reference

finite radish
#

oh, didn't know about the libraries. that's neat

#

i just created a batch script to decompile everything in /zombie/

sour island
#

yeah, the author unfortunately disappeared ๐Ÿ‘๏ธ ๐Ÿ‘„ ๐Ÿ‘๏ธ

finite radish
#

TIS spooks got to him

sour island
#

it's fine he was a bit of a mop

finite radish
#

rest in pieces

#

was that the CocoLabs guy?

sour island
#

yeah, you were around for that?

finite radish
#

yeah lol

#

briefly

sour island
#

๐Ÿคœ ๐Ÿค›

#

yeah, he took the 'hey kid, let me see that mod' and went overboard

finite radish
sour island
#

scared off everyone - but his library thing is cool

finite radish
#

i think i remember interacting with you a bit back then, but it was a while ago now

#

i was the guy trying to convince him to clean up the code and make it more usable/readable for the average person to use

sour island
#

I left pretty early - and yeah same

#

told him to not require github usage outright - or to require having all that graddle shit intertwined with every project

#

seems like he eventually listened

finite radish
#

i've been in and out of the zomboid community a lot without really ever releasing any of my work, since like 2015 or so. been playing since like 2012 though. it's been a wild ride

#

i thought his framework had some promise, but only if other people came in and started to help with it

sour island
#

I thought so too - but asking for all or nothing + multiple new programs is alot on someone unfamiliar/new to programming

finite radish
sour island
#

he basically said 'well then they're not who "we're" looking for' unironically

finite radish
#

yeah lmfao. the elitism was wild

sour island
#

he made me write tests in java insisting it was the right way to start a Lua mod

finite radish
#

i did my bi-annual return to zomboid modding/etc. recently and decided to see how cocolabs was doing only to find it had died at pretty much the same time that I lasted checked up on it lmfao

sour island
#

neither of us knew what a vector was - and when I figured out how they work he got upset ๐Ÿ˜ฆ

#

that still bugs me

finite radish
bronze yoke
#

paints a very specific picture

sour island
#

basically Dennis from always sunny

tame mulch
sour island
#

those tests proved pointless cause TIS included a dead vector2 file that overwrites the exposure anyway - spent like 2 days looking at an output log to see X/Y position changes . _ .

finite radish
#

breaking news: TIS dev tells modders "fix our game, our codebase only supports BUGS"
more at at 11

sour island
finite radish
finite radish
sour island
#

can't wait for the roach update and all the puns

#

going to be totally not overused

finite radish
#

update: it's still going

#

oh whoops, meant to post this in #mapping my bad. i guess it still sorta fits here, but whatever

sour island
#

Anyone know if there's a wrap option to draw text lol

bleak prairie
#

How would I know if someone is typing + someome is inside a building?

agile vigil
# sour island

Probably not - but because you can measure text width you can manually create a text-flow setup.

agile vigil
sour island
#

I'm kind of worried about setting it in a tooltip lol

#

might grab a constant string in the tooltip and set it up outside

#

the Mod: SRJ is the perfect length ๐Ÿ˜ฎ

bleak prairie
warped valve
#

Anyone know of a way to overwrite footsteps dynamically? E.g. you equip an item and change the footsteps, then if you unequip they revert back to default footsteps

sour island
#

Well that's not very helpful

hot patrol
#

Anybody know if someone has created a fork for better towing and lockpicking. They are some of my favorite mods but for obvious reasons haven't been updated. I was recently reminded of how much I missed being able to push cars when I had to clear out 3 damn road blocks for my bus.

sour island
#

took me this whole time to realize I Ieft out a parameter for measureX drunk

ancient grail
# sour island Anyone know if there's a wrap option to draw text lol
GitHub

Community API is a team effort to centralize & give mod creators optimized tools for creating quality mods. - PZ-Community-API/Contents/mods/CommunityAPI/media/lua/client/ItemTooltipAPI at ...

sour island
#

too late - and I should know about that one

robust jetty
#

What is for ISPanel:derive?

ancient grail
sour island
#

Does it have a wrap function?

ancient grail
ancient grail
sour island
#

Also, I meant I'm a contributor lol - I should've known about his tooltipAPI

#

that project is using the same steam account for uploading as the comm patch I'm starting up

ancient grail
#

I mean u as a contributor i think i saw that too

sour island
#

Yeah, I think it was too ambitious / needed more planning / less scope

#

also the issue mentioned before with authorship and trying to get the ball rolling on a giant API package

#

if it were to be brought up again I think each API would have to be a standalone

ancient grail
#

If all the modders that made utils apis helpers tools
Etc

Come together and help build what your planning then it will be done in no time i bet

#

Or if the whole mod is free for all then combine it to something like aud

It will enable nodders to do testing and debug faster then just take the function they used from the tool since its free for all

bleak prairie
ancient grail
#

Or maybe it doesnt have to be a mod
Like a directory of functions and template would be nice

ancient grail
#

Or maybe im wrong .

bleak prairie
#

I've never made a mod in zomboid, got no clue how it works but I use Lua often so I don't need to learn lua lol.

#

Any references I should use?

ancient grail
#

Try to get specific player the. isSeen()

#

Try it on debug

#

Open up 2 pz instances
Host:
-nosteam -debug
Client:
-nosteam

#

So you can test MP stuff

#

What are u trying to do exactly? If u dont mind me asking

bleak prairie
#

For the rp server I play on because it's annoying having to guess when someone is typing

ancient grail
#

Theres already a.mod like that

sour island
#

using -nosteam will disable the Workshops folder - if you use the folder to develop mods you'll have to take out the MODFOLDER in MODNAME/Contents/mods/MODFOLDER and move it into the Mods/ folder

ancient grail
#

But i noticed it printed alot

#

So its quite spammy

sour island
#

isn't that what chat bubble is?

bleak prairie
#

(wrong mention)

sour island
#

so you want a different icon or just '...' above their head?

bleak prairie
#

And chat bubble I'm pretty sure you can see it through the wall

#

If what my friend told me is correct

sour island
#

you probably can as you can see chat through walls

#

all its doing is adding an emote into the text

bleak prairie
#

Ah yeah true, I guess being able to see text through walls completely removes the point of not being able to see it through walls lol

#

I've got what I need then

ancient grail
#

Use whisper

bleak prairie
sour island
#

hmm

drifting ore
# ancient grail IsSeen() i think?

ohai. i'm learning a bit still and noticed you were able to make a tile from vanilla into a moveable and use it without a ton of extra code that causes performance issues. I wanted to do something similar with lightswitches. if you are willing to answer... i am trying to find out do you have an example of what that structure looked like as far as what was needed? i have the item and recipe down. but im trying to figure out. do i have to replace the entire newtilesdef with the indoor_lighting for lightswitches properties edited? or in your opinion would it be smarter for me to edit that tilepack and remove all properties except the specific tileset im using? or do you have a better way of doing it? i seen the namin scheme mattered also for the tile name vs the item name?

#

essentially working on a mod that will allow you to craft makeshift lightswitches and place them into room which will light up how it would if you used the tile brush to place, but be able to hold the item and use. also if anyone is aware how to add multiple tiles to one item for different directions to utilize the "rotate" feature so it can be just one item instead of one per direction if possible

bleak prairie
sour island
#

Figured out the hiccup - hate the layout though

ancient grail
#

Well for the vault containers is my own tiles so i can define it however i want.. for the atms
It was a messy thing

I had to destroy it but add it again as a new thing

#

With all the various changes on the property.
U really cant change the default tiles nature unless u make another one i guess

But i could be wrong..

U could probably write up a code that whenever a lightswitch is detected change that tile to whatver u needed

drifting ore
#

if i just use those tiles but remake a new pack (i will most likely use an editor to change the model itself also to have more of a makeshift look) that should work then?

#

just change the properties to allow pickuptool and placetool and moveable?

#

and whatever goes along with it... but how do i reference that in the item itself?

ancient grail
#

You can add a sprite without any property and when u spawn it u actually spawn the vanilla light switch then change the sprite

obj:setName()
obj:getSprite():getName()

drifting ore
#

ooooo

ancient grail
#

I think u need to modify both for it to chabge properly

drifting ore
#

siick. i got a ways to go still here but using this as my intro to figuring this stuff out lol. i really appreciate it

ancient grail
#

Its easier to create something
Its harder to change something
If get what i mean

#

Sure anytime man

#

๐Ÿซก

drifting ore
#

yep. so just using and editing the original tiles and remaking a new pack with just those in it would be most ideal it seems

#

if i just rename is all it should take to not conflict?

#

and of course not overwrite anything else ๐Ÿ˜›

#

im not speaking in the grand scheme but just as far as not messing with currently functioning light switches

sour island
#

๐Ÿ‘

drifting ore
#

clleaaan

#

oh and thank you for all your answers so far as well. i would have taken ahot min to get here solo

ancient grail
#

Yep since you are only adding light switch that would be all u need just spawn the default switch then change sprite

But i dont know if the light switches finctions after u spawn it
Cuz i think it has an offset thing

Not sure

drifting ore
#

as a tile it does

#

you can place the tile and as long as it recognizes its a room, will light that room. if thats what you mean

ancient grail
#

Also if you want to avoid codes
U can always create an overlay . But the limit here is that it should block the thing your trying to replace

drifting ore
#

ahhhh

ancient grail
#

Ahhh nice

#

Good to know

drifting ore
#

yea, can use brush tool to add functioning ligfhtswitch anywhere is a defined room

ancient grail
#

U got the name of the light switch vanilla and your tile?

drifting ore
#

it's the ones from the indoor_lighting

ancient grail
#

Youre primarily a mapper right?

drifting ore
#

with the lamps

#

yes and tbh i literally just start anything pz related around 1.5 months ago

#

so tons of info blasted into me

#

i know 3d modeling and whatnot and did gta v modding and some old league of legends lua modding

ancient grail
#

Well i think light switches and lamps are different

drifting ore
#

well lamps already are moveable right

#

they are just the same tileset

#

is why i mention

#

like 8 tiles from that are lights switches indoor_lighting_01_01 i think is one

ancient grail
#

Ye u have to get the actual tile name

constructedobjects_01_20

This is the bear trap (wrote that based on memory so forgive me if its wrong)

drifting ore
#

oh awesome

ancient grail
#

The open bear trap

The open 1 is 21

drifting ore
#

i'm pretty sure my feeble mind is comprehending

#

yea the switches are indoor_lighting_01_01, 01_02, 01_03 etc

ancient grail
#

So if i need to convert the open to close

I need both names

Cuz i need to detect the open first then use the close to replace

#

Ah cuz of the directions

drifting ore
#

yes

#

it is semi important that im able to implement that feature

#

i can't remember wher ei saw it before

ancient grail
#

But you only need 1 pair to test if there are alot you need to create a function .

drifting ore
#

but i swear i saw and item with different types or something all within the item also. that was the other part of this that i wasnt sure about

#

typer of sprites

#

for each direction, can use place, hold cursor and it uses diff sprite depending on dir?

ancient grail
#

Which is what i did on my safecrackermod
It was hard to define em cuz there are alot

So ehat i did was all of the odd numbered tiles are close
And even numbered tiles are open

#

So it would be easier to check

azure maple
#

Hello. Does anyone have a good farming mod?

drifting ore
#

thanks so much holy moly

#

feeling like i may be able to actually get this figured out

faint jewel
ancient grail
#

@drifting ore not really sure if it will work i just wrote it and not test it

#
      function setLightSwitch (obj)
        local tileToChange = "lightswitchname"
        local changeInto = "yourlightswitchtilename"
            if obj:getSprite():getName(tileToChange) then
            obj:setSprite(changeInto)
            obj:getSprite():setName(changeInto)
            if isClient() then obj:transmitUpdatedSpriteToServer(); end
            getPlayerLoot(0):refreshBackpacks()  
            end
      end
      Events.OnObjectAdded.Add(setLightSwitch) 
drifting ore
#

there is a salvage context menu utilized somewhere also that removes cars right? if im super far off base ill stop, but would that work for what you are doing? at least as far as removing? @faint jewel

drifting ore
#

thanks!!!

ancient grail
#

@faint jewel

function getCar()
local car = nil
local pl = getPlayer()
    if pl:getVehicle() then car = pl:getVehicle() 
    elseif pl:getNearVehicle() then car = pl:getNearVehicle()
    elseif  pl:getUseableVehicle() then car = pl:getUseableVehicle() 
    end
return car
end
local vehicle = getCar()
sendClientCommand(getPlayer(), "vehicle", "remove", { vehicle = vehicle:getId() })
#

this worked for me

#

i just tried it on a live mp server

#

using debug

winter thunder
#

When it comes to giving items mod data in the script files, anyone know if I can make a table internally?

Like- I basically want to make a mod data sub-table within the item script if that is possible

drifting stump
#

however you can do it with lua

ancient grail
drifting ore
#
local items = {
  "Pistol", "Pistol2", "Pistol3", "Revolver_Short", "Revolver", "Revolver_Long"
}

for i, item in ipairs(items) do
 SOMETHING
end```
@winter thunder  is the only way i've used a table so far and its fast and works
winter thunder
#

Ideally it would look something like this. So that I could reference the mod data with like item:getModata().Gusher.type

item ExampleUsingGushers
    {
        DisplayName = Blue Raspberry Gusher,
        Type = Food,
        Weight = 0.1,
    HungerChange = -100,

        Gusher = 
        {
        Type = Fruit Snack,
        Flavor = Blue,
        AreDogsCool = Yes,
        Cost = 500
        }
    }
drifting ore
#

oh you want to with the item itself

winter thunder
#

nah so, I have a framework using LUA. I am just thinking it would be easier to instance my info inside the item def instead of a secondary table

drifting ore
#

interesting

#

i'd like to know if thats possible LOL

winter thunder
#

You can write mod data to items that way, as long as the variable is something new, the game will just consider it mod data. I am already doing it to give the name of the reference table to my function from the item

drifting ore
#

god i have so much to figure out still

winter thunder
#

This was the item that I made for testing my function lol

drifting stump
#

again you can do it from lua

drifting ore
#

๐Ÿ˜„

#

cut the list down quick oops

ancient grail
#

local items =