Solved Tracking how long an item is in an inventory

  • Welcome to skUnity!

    Welcome to skUnity! This is a forum where members of the Skript community can communicate and interact. Skript Resource Creators can post their Resources for all to see and use.

    If you haven't done so already, feel free to join our official Discord server to expand your level of interaction with the community!

    Now, what are you waiting for? Join the community now!

  • LOOKING FOR A VERSION OF SKRIPT?

    You can always check out skUnity Downloads for downloads and any other information about Skript!

Milosauce

New Member
Dec 11, 2021
5
1
3
I have a freezer (iron block) that opens a hopper inventory when you right click it. I want to be able to put an item in the freezer and track how long it is in for so that I can freeze it once it has been inside for long enough. I can't find any expressions about the time an inventory slot has been set for and I can't think of any ways of doing it.
Skript Version: 2.7.0-beta2
Skript Author:
Bensku
Minecraft Version: 1.19.4
Full Code:
Code:
on rightclick on iron block:
    if {statuscook::%location of event-block%} is true:
        cancel event
        open a hopper inventory named "%location of event-block%" to the player
        loop integers from 0 to 4:
            set slot loop-value of player's current inventory to {freezer::%loop-value%::%name of player's current inventory%}
    else if name of player's held item is "&9Cook Hammer":
        cancel event
        set {statuscook::%location of event-block%} to true
        send "&5This is now a freezer." to the player
  
on inventory close:
    event-inventory's type is a hopper inventory
    loop integers from 0 to 4:
        set {freezer::%loop-value%::%name of event-inventory%} to slot loop-value of event-inventory


Edit: I thought of a way to do it and i wrote some code, but whenever the player closes the inventory it loses track of the time.
new code:
Code:
on rightclick on iron block:
    name of player's held item isn't "&9Debug Axe"
    if {statuscook::%location of event-block%} is true:
        cancel event
        open a chest inventory with 1 row named "&9Freezer" to the player
        set {_i} to "%location of event-block%"
        set slot 0 of player's current inventory to light gray stained glass pane named "%{_i}%"
        set slot 1 of player's current inventory to light gray stained glass pane named "%{_i}%"
        set slot 7 of player's current inventory to light gray stained glass pane named "%{_i}%"
        set slot 8 of player's current inventory to light gray stained glass pane named "%{_i}%"
        loop integers from 2 to 6:
            set slot loop-value of player's current inventory to {freezer::%loop-value%::%{_i}%}
    else if name of player's held item is "&9Cook Hammer":
        cancel event
        set {statuscook::%location of event-block%} to true
        send "&5This is now a freezer." to the player
    
on inventory close:
    event-inventory's type is a chest inventory with 1 row named "&9Freezer"
    set {_i} to name of slot 0 of event-inventory
    loop integers from 2 to 6:
        set {freezer::%loop-value%::%{_i}%} to slot loop-value of event-inventory
        
on inventory click:
    event-inventory's name is "&9Freezer"
    if the clicked slot is light gray stained glass pane:
        cancel event
        stop
    else if clicked slot is air:
        cursor slot of player is clay ball named "&9Meth Sludge"
        if item size of cursor slot of player is greater than 1:
            send "&5Please move items one at a time" to the player
            cancel event
        else:
            wait 1 tick
            set {_i} to 0
            while clicked slot is clay ball named "&9Meth Sludge":
                wait 1 second
                add 1 to {_i}
                if {_i} is greater than 5:
                    set clicked slot to prismarine shard named "&9Meth Crystal"
                    stop
    else if cursor slot of player is not air:
        send "&5Please move items one at a time" to the player
        cancel event
[doublepost=1684710559,1684635646][/doublepost]it works guys, i did it. i really want to thank the 22 people that saw what i was asking and gave up. heres the code incase yall weird ass mfs want a meth freezer
Code:
on rightclick on iron block:
    name of player's held item isn't "&9Debug Axe"
    if {statuscook::%location of event-block%} is true:
        cancel event
        set {_i} to "%location of event-block%"
        if {statusfiltering::%{_i}%} is not true:
            open a chest inventory with 1 row named "&9Freezer" to the player
            set slot 0 of player's current inventory to light gray stained glass pane named "%{_i}%"
            set slot 1 of player's current inventory to lime stained glass pane named "&aStart" with lore "&aFreeze time: 5 minutes"
            set slot 7 of player's current inventory to lime stained glass pane named "&aStart" with lore "&aFreeze time: 5 minutes"
            set slot 8 of player's current inventory to light gray stained glass pane named "%{_i}%"
            loop integers from 2 to 6:
                set slot loop-value of player's current inventory to {freezer::%loop-value%::%{_i}%}
        else:
            send "&5Freezing. Time left: %{cooktime::%{_i}%}% minutes" to the player
    else if name of player's held item is "&9Cook Hammer":
        cancel event
        set {statuscook::%location of event-block%} to true
        send "&5This is now a freezer." to the player
    
on inventory close:
    event-inventory's type is a chest inventory with 1 row named "&9Freezer"
    set {_i} to name of slot 0 of event-inventory
    loop integers from 2 to 6:
        set {freezer::%loop-value%::%{_i}%} to slot loop-value of event-inventory
        
on inventory click:
    event-inventory's name is "&9Freezer"
    if the clicked slot is light gray stained glass pane:
        cancel event
        stop
    else if clicked slot is lime stained glass pane named "&aStart":
        cancel event
        set {_i} to name of slot 0 of event-inventory
        close the inventory of player
        set {statusfiltering::%{_i}%} to true
        loop integers from 2 to 6:
            name of slot loop-value of event-inventory is "&9Meth Sludge"
            set {freezer::%loop-value%::%{_i}%} to prismarine shard named "&9Meth Crystal"
        set {cooktime::%{_i}%} to 5
        loop 5 times:
            wait 1 minute
            subtract 1 from {cooktime::%{_i}%}
        delete {cooktime::%{_i}%}
        delete {statusfiltering::%{_i}%}
    else if clicked slot is air:
        cursor slot of player is not mushroom stew named "&9Meth Sludge" or air
        cursor slot of player is not prismarine shards named "&9Meth Crystal"
        cancel event
        send "&5Please only put Meth Sludge in the freezer."
        stop
    else if clicked slot is not mushroom stew named "&9Meth Sludge":
        if clicked slot is not prismarine shards named "&9Meth Crystal":
            cancel event
            send "&5Please only put Meth Sludge in the freezer."
            stop
 
I have a freezer (iron block) that opens a hopper inventory when you right click it. I want to be able to put an item in the freezer and track how long it is in for so that I can freeze it once it has been inside for long enough. I can't find any expressions about the time an inventory slot has been set for and I can't think of any ways of doing it.
Skript Version: 2.7.0-beta2
Skript Author:
Bensku
Minecraft Version: 1.19.4
Full Code:
Code:
on rightclick on iron block:
    if {statuscook::%location of event-block%} is true:
        cancel event
        open a hopper inventory named "%location of event-block%" to the player
        loop integers from 0 to 4:
            set slot loop-value of player's current inventory to {freezer::%loop-value%::%name of player's current inventory%}
    else if name of player's held item is "&9Cook Hammer":
        cancel event
        set {statuscook::%location of event-block%} to true
        send "&5This is now a freezer." to the player
 
on inventory close:
    event-inventory's type is a hopper inventory
    loop integers from 0 to 4:
        set {freezer::%loop-value%::%name of event-inventory%} to slot loop-value of event-inventory


Edit: I thought of a way to do it and i wrote some code, but whenever the player closes the inventory it loses track of the time.
new code:
Code:
on rightclick on iron block:
    name of player's held item isn't "&9Debug Axe"
    if {statuscook::%location of event-block%} is true:
        cancel event
        open a chest inventory with 1 row named "&9Freezer" to the player
        set {_i} to "%location of event-block%"
        set slot 0 of player's current inventory to light gray stained glass pane named "%{_i}%"
        set slot 1 of player's current inventory to light gray stained glass pane named "%{_i}%"
        set slot 7 of player's current inventory to light gray stained glass pane named "%{_i}%"
        set slot 8 of player's current inventory to light gray stained glass pane named "%{_i}%"
        loop integers from 2 to 6:
            set slot loop-value of player's current inventory to {freezer::%loop-value%::%{_i}%}
    else if name of player's held item is "&9Cook Hammer":
        cancel event
        set {statuscook::%location of event-block%} to true
        send "&5This is now a freezer." to the player
   
on inventory close:
    event-inventory's type is a chest inventory with 1 row named "&9Freezer"
    set {_i} to name of slot 0 of event-inventory
    loop integers from 2 to 6:
        set {freezer::%loop-value%::%{_i}%} to slot loop-value of event-inventory
       
on inventory click:
    event-inventory's name is "&9Freezer"
    if the clicked slot is light gray stained glass pane:
        cancel event
        stop
    else if clicked slot is air:
        cursor slot of player is clay ball named "&9Meth Sludge"
        if item size of cursor slot of player is greater than 1:
            send "&5Please move items one at a time" to the player
            cancel event
        else:
            wait 1 tick
            set {_i} to 0
            while clicked slot is clay ball named "&9Meth Sludge":
                wait 1 second
                add 1 to {_i}
                if {_i} is greater than 5:
                    set clicked slot to prismarine shard named "&9Meth Crystal"
                    stop
    else if cursor slot of player is not air:
        send "&5Please move items one at a time" to the player
        cancel event
[doublepost=1684710559,1684635646][/doublepost]it works guys, i did it. i really want to thank the 22 people that saw what i was asking and gave up. heres the code incase yall weird ass mfs want a meth freezer
Code:
on rightclick on iron block:
    name of player's held item isn't "&9Debug Axe"
    if {statuscook::%location of event-block%} is true:
        cancel event
        set {_i} to "%location of event-block%"
        if {statusfiltering::%{_i}%} is not true:
            open a chest inventory with 1 row named "&9Freezer" to the player
            set slot 0 of player's current inventory to light gray stained glass pane named "%{_i}%"
            set slot 1 of player's current inventory to lime stained glass pane named "&aStart" with lore "&aFreeze time: 5 minutes"
            set slot 7 of player's current inventory to lime stained glass pane named "&aStart" with lore "&aFreeze time: 5 minutes"
            set slot 8 of player's current inventory to light gray stained glass pane named "%{_i}%"
            loop integers from 2 to 6:
                set slot loop-value of player's current inventory to {freezer::%loop-value%::%{_i}%}
        else:
            send "&5Freezing. Time left: %{cooktime::%{_i}%}% minutes" to the player
    else if name of player's held item is "&9Cook Hammer":
        cancel event
        set {statuscook::%location of event-block%} to true
        send "&5This is now a freezer." to the player
   
on inventory close:
    event-inventory's type is a chest inventory with 1 row named "&9Freezer"
    set {_i} to name of slot 0 of event-inventory
    loop integers from 2 to 6:
        set {freezer::%loop-value%::%{_i}%} to slot loop-value of event-inventory
       
on inventory click:
    event-inventory's name is "&9Freezer"
    if the clicked slot is light gray stained glass pane:
        cancel event
        stop
    else if clicked slot is lime stained glass pane named "&aStart":
        cancel event
        set {_i} to name of slot 0 of event-inventory
        close the inventory of player
        set {statusfiltering::%{_i}%} to true
        loop integers from 2 to 6:
            name of slot loop-value of event-inventory is "&9Meth Sludge"
            set {freezer::%loop-value%::%{_i}%} to prismarine shard named "&9Meth Crystal"
        set {cooktime::%{_i}%} to 5
        loop 5 times:
            wait 1 minute
            subtract 1 from {cooktime::%{_i}%}
        delete {cooktime::%{_i}%}
        delete {statusfiltering::%{_i}%}
    else if clicked slot is air:
        cursor slot of player is not mushroom stew named "&9Meth Sludge" or air
        cursor slot of player is not prismarine shards named "&9Meth Crystal"
        cancel event
        send "&5Please only put Meth Sludge in the freezer."
        stop
    else if clicked slot is not mushroom stew named "&9Meth Sludge":
        if clicked slot is not prismarine shards named "&9Meth Crystal":
            cancel event
            send "&5Please only put Meth Sludge in the freezer."
            stop
I personally did not understand your task (before editing the post), after you attached additional code and edited the text of the task itself, it became clear.
And here is the solution for you.
Need Skript-reflect addon to handle InventoryDragEvent (This event is called when the player drags an item in their cursor across the inventory.)
Oh, 22 people looked at me, no one answered on the semi-live forum, THANK YOU FOR HELPING. Burn more.


Code:
options:
  cookingTime: 300 #cooking time in seconds

import:
  org.bukkit.event.inventory.InventoryDragEvent

# handle any block breaks if block if freezer
function handleBreakFreezer(block: block):
  {freezer::%location of {_block}%::inventory} is set
  # try to check if cooking is ready
  if {freezer::%location of {_block}%::cookingTime} is set:
    set {_cookingTime} to {freezer::%location of {_block}%::cookingTime}
    if {_cookingTime} is less than or equal to unix timestamp of now:
      loop integers from 2 to 6:
        if slot loop-value of {freezer::%location of {_block}%::inventory} is mushroom stew named "&9Meth Sludge":
          set slot loop-value of {freezer::%location of {_block}%::inventory} to prismarine shard named "&9Meth Crystal"
 
  # drop items from freezer
  loop integers from 2 to 6:
    drop slot loop-value of {freezer::%location of {_block}%::inventory} at {_block}
 
  # close this inventory on all players what opened it
  loop viewers of {freezer::%location of {_block}%::inventory}:
    close inventory of loop-value

  delete {freezer::%location of {_block}%::*}

# handle if freezer to far from player, simply close freezer.
function handleOpenDistance(player: player, location: location, inventory: inventory):
  while distance between {_player} and {_location} is less than 5:
    if current inventory of {_player} is not {_inventory}:
      stop
    wait 5 ticks
  if current inventory of {_player} is {_inventory}: 
    close inventory of {_player}

# Try to fetch index of freezer by inventory
function fetchFreezer(inventory: inventory) :: text:
  loop indexes of {freezer::*}:
    if {_inventory} is {freezer::%loop-value%::inventory}:
      set {_index} to loop-value
      stop loop
  return {_index}

on break of iron block:
  handleBreakFreezer(event-block)

on explode:
  loop exploded blocks:
    handleBreakFreezer(loop-block)

on piston extend:
  loop moved blocks:
    if {freezer::%location of loop-block%::inventory} is set:
      cancel event
      stop

on piston retract:
  loop moved blocks:
    if {freezer::%location of loop-block%::inventory} is set:
      cancel event
      stop

on rightclick on iron block:
  name of player's held item isn't "&9Debug Axe"
  if {freezer::%location of event-block%::inventory} is set:
    set {_index} to location of event-block
    cancel event
    if {freezer::%{_index}%::cookingTime} is set:
      set {_cookingTime} to {freezer::%{_index}%::cookingTime}
      set {_difference} to {_cookingTime}-unix timestamp of now
      if  {_difference} is less than or equal to 0:
        delete {freezer::%{_index}%::cookingTime}
        loop integers from 2 to 6:
          if slot loop-value of {freezer::%{_index}%::inventory} is mushroom stew named "&9Meth Sludge":
            set slot loop-value of {freezer::%{_index}%::inventory} to prismarine shard named "&9Meth Crystal"
      else:
        send "&5Freezing. Time left: %round ({_difference}/60)% minutes" to the player
        stop

    open {freezer::%{_index}%::inventory} to player
    handleOpenDistance(player, {_index}, {freezer::%{_index}%::inventory})

  else if name of player's held item is "&9Cook Hammer":
    cancel event
    set {_inventory} to chest inventory with 1 row named "&9Freezer"
    set slot 0 of {_inventory} to light gray stained glass pane named " "
    set slot 1 of {_inventory} to lime stained glass pane named "&aStart" with lore "&aFreeze time: 5 minutes"
    set slot 7 of {_inventory} to lime stained glass pane named "&aStart" with lore "&aFreeze time: 5 minutes"
    set slot 8 of {_inventory} to light gray stained glass pane named " "
    set {freezer::%location of event-block%::inventory} to {_inventory}
    send "&5This is now a freezer." to the player

# handle rightclick hold with any item instead of 'Meth Sludge'
on InventoryDragEvent:
  set {_index} to fetchFreezer(event.getInventory())
  {_index} is set
  loop ...event.getNewItems().values():
    if loop-value is not mushroom stew named "&9Meth Sludge":
      cancel event
      send "&5Please only put Meth Sludge in the freezer." to event.getWhoClicked()
      stop
    
on inventory click:
  # we need get index of freezer in any cases (event-inventory give us inventory where cause action)
  set {_index} to fetchFreezer(current inventory of player)
  {_index} is set

  # handle shift clicks on items in player's inventory
  if event-inventory is not current inventory of player:
    if inventory action is instant move:
      if event-item is not mushroom stew named "&9Meth Sludge":
        send "&5Please only put Meth Sludge in the freezer." to player
        cancel event
    stop

  # handle unusable decoration slots
  if the clicked slot is 0 or 8:
    cancel event
    stop 

  if index of event-slot is 1 or 7:
    cancel event
    
    loop integers from 2 to 6:
      set {_slot} to slot loop-value of {freezer::%{_index}%::inventory}
      if {_slot} is mushroom stew named "&9Meth Sludge":
        set {_existsToCook} to true
      else if {_slot} is not air:
        send "&9Remove all unnecessary items from freezer before cooking" to player
        stop
    if {_existsToCook} is true:
      set {freezer::%{_index}%::cookingTime} to unix timestamp of now + {@cookingTime}
      loop viewers of {freezer::%{_index}%::inventory}:
        close inventory of loop-value
        send "&fStart cooking &9Meth Crystals" to loop-value
    else:
      send "&fPut at least one &9Meth Sludge &fbefore start cooking" to player
    
  else if index of event-slot is between 2 and 6:
    if cursor slot of player is not mushroom stew named "&9Meth Sludge" or air:
      send "&5Please only put Meth Sludge in the freezer." to player
      cancel event