Is it possible to locate an item via console using item ID?

Ask for help about creating mods and scripts for Grimrock 2 or share your tips, scripts, tools and assets with other modders here. Warning: forum contains spoilers!
User avatar
sapientCrow
Posts: 608
Joined: Sun Apr 22, 2012 10:57 am

Is it possible to locate an item via console using item ID?

Post by sapientCrow »

As stated..
Is it at all possible to use a console command to locate where a specific item is and what level based on an item ID?

thanks for the help
User avatar
Isaac
Posts: 3172
Joined: Fri Mar 02, 2012 10:02 pm

Re: Is it possible to locate an item via console using item ID?

Post by Isaac »

It's possible if that item already exists (on the floor) in the dungeon; it won't work with items that come from scripts, but have not yet been spawned. It won't locate items inside surface containers, unless those containers are individually searched. You would first have to access the containers, then check every item inside each of them.

You could use a custom function in the console that iterates through every object found on each map level using allEntities(), and check them for an item component, and/or a surface component. Objects having surfaces would then have their contents searched for the item.

If you have the custom ID of the object then it's easier, but auto-generated instances are given numerical IDs, so they need component inspection to determine what they are.

Sacks and wooden boxes can be put into chests; if found in a surface, their contents must each be checked individually.
User avatar
sapientCrow
Posts: 608
Joined: Sun Apr 22, 2012 10:57 am

Re: Is it possible to locate an item via console using item ID?

Post by sapientCrow »

thank you for the response

the goal is toe find an item if it is there that is which would be on the ground already in a certain level

so could I console something that said check this level for this ID?
User avatar
Isaac
Posts: 3172
Joined: Fri Mar 02, 2012 10:02 pm

Re: Is it possible to locate an item via console using item ID?

Post by Isaac »

sapientCrow wrote: Mon Jul 10, 2023 2:39 pm ...so could I console something that said check this level for this ID?
The answer is yes—if you are asking whether such a thing is possible to make (on your own) and use it in the console.

Here is the best resource for Grimrock 2 scripting: https://github.com/JKos/log2doc/wiki

And here are the relevant object functions: https://github.com/JKos/log2doc/wiki/Ob ... lasses#map

But if you are asking for an example, there is a dedicated Question & Answer thread for LoG2 scripting problems; this question has been answered a few times in it. The thread is a trove of esoteric solutions for just about anything imaginable within the engine.

http://www.grimrock.net/forum/viewtopic ... 50#p109544

Code: Select all

Dungeon.getMap([level number]):allEntities()

So... You can use the level number to search: Dungeon.getMap(1):allEntities()
or you can search whatever level the party is currently on: Dungeon.getMap(party.level):allEntities()

The allEntities() function returns either nil (nothing), or the first object found. To see any output from this you will need to print it to the console.
Last edited by Isaac on Mon Jul 10, 2023 8:20 pm, edited 3 times in total.
User avatar
sapientCrow
Posts: 608
Joined: Sun Apr 22, 2012 10:57 am

Re: Is it possible to locate an item via console using item ID?

Post by sapientCrow »

thanks again very much

so I use
print (Dungeon.getMap(party.level):allEntities())

and the first line is just a function

can i push this out to a log file or text document with an entire list /array of the level I am on

total newbie in coding here so sorry for ignorance
User avatar
Isaac
Posts: 3172
Joined: Fri Mar 02, 2012 10:02 pm

Re: Is it possible to locate an item via console using item ID?

Post by Isaac »

You can paste this into the console to locate the item with the id, "serpent_staff_1".

You can change the quoted id string to be the id that you wish to find.

Code: Select all

do 
	local_item_id = "serpent_staff_1" 
	
	for index = 1, Dungeon:getMaxLevels() do 
		for item in Dungeon.getMap(index):allEntities() do 
			if item.id == local_item_id then 
				hudPrint("A matching item was found in "..item.map:getName().." ".."(level "..item.level..") @ tile X:"..tostring(item.x)..",Y:"..tostring(item.y)) 
				setMouseItem(item.item) 
				playSound("secret") party:spawn('blob') 
				return 	
			end 
		end 
	end 
	hudPrint("No matching item was found")
end	
Note: It is important to paste the whole thing, including the trailing spaces at the end of each line. Be sure to leave the space character at the end of the line when you change the id string.
User avatar
sapientCrow
Posts: 608
Joined: Sun Apr 22, 2012 10:57 am

Re: Is it possible to locate an item via console using item ID?

Post by sapientCrow »

thanks I really appreciate you taking the time to make this

I am not able to get to ever return true though

like I spawn a tome of wisdom and change item Id to tome_wisdom and drop the tome on floor and it still returns no item found
User avatar
Isaac
Posts: 3172
Joined: Fri Mar 02, 2012 10:02 pm

Re: Is it possible to locate an item via console using item ID?

Post by Isaac »

Try placing (not spawning) a serpent staff in the editor; test the preview to ensure that it's working as intended.

________________

I tested a blank map with a tome of wisdom, and the script located it.

Code: Select all

do 
	local_item_id = "tome_wisdom" 
	
	for index = 1, Dungeon:getMaxLevels() do 
		for item in Dungeon.getMap(index):allEntities() do 
			if item.id == local_item_id then 
				hudPrint("A matching item was found in "..item.map:getName().." ".."(level "..item.level..") @ tile X:"..tostring(item.x)..",Y:"..tostring(item.y)) 
				setMouseItem(item.item) 
				playSound("secret") party:spawn('blob') 
				return 	
			end 
		end 
	end 
	hudPrint("No matching item was found")
end	
_______________

When you say, "spawn", do you mean in-game, or in-editor, and do you mean spawn via console command, or by placement (with mouse) in the editor?
User avatar
sapientCrow
Posts: 608
Joined: Sun Apr 22, 2012 10:57 am

Re: Is it possible to locate an item via console using item ID?

Post by sapientCrow »

Isaac wrote: Mon Jul 10, 2023 9:40 pm Try placing (not spawning) a serpent staff in the editor; test the preview to ensure that it's working as intended.

________________

I tested a blank map with a tome of wisdom, and the script located it.

Code: Select all

do 
	local_item_id = "tome_wisdom" 
	
	for index = 1, Dungeon:getMaxLevels() do 
		for item in Dungeon.getMap(index):allEntities() do 
			if item.id == local_item_id then 
				hudPrint("A matching item was found in "..item.map:getName().." ".."(level "..item.level..") @ tile X:"..tostring(item.x)..",Y:"..tostring(item.y)) 
				setMouseItem(item.item) 
				playSound("secret") party:spawn('blob') 
				return 	
			end 
		end 
	end 
	hudPrint("No matching item was found")
end	
_______________

When you say, "spawn", do you mean in-game, or in-editor, and do you mean spawn via console command, or by placement (with mouse) in the editor?
spawn as in spawn with console
User avatar
Isaac
Posts: 3172
Joined: Fri Mar 02, 2012 10:02 pm

Re: Is it possible to locate an item via console using item ID?

Post by Isaac »

Can you type that command here, as used?
Post Reply