aboutsummaryrefslogtreecommitdiff
path: root/tutorials
diff options
context:
space:
mode:
Diffstat (limited to 'tutorials')
-rw-r--r--tutorials/tut042_too_many_items.md2
-rw-r--r--tutorials/tut050_entities.md34
2 files changed, 35 insertions, 1 deletions
diff --git a/tutorials/tut042_too_many_items.md b/tutorials/tut042_too_many_items.md
index 9d95b00..48ba0cf 100644
--- a/tutorials/tut042_too_many_items.md
+++ b/tutorials/tut042_too_many_items.md
@@ -2,7 +2,7 @@
## Too many items
-In the last tutorial we saw how to create lots and lots of items. Sometimes, you think to yourself "that's way too many", and when you do, you simplify. Rougelike games have a tendency to have attributes associated with items. Commonly, "blessed", "normal", and "cursed". In this tutorial, we'll be using the technique discussed in @{tut021_detouring.md} to give every item one of these stats by overrideing @{item.lua.RegisterItem} the Serialize() and DeSerialize() methods to give every item a little extra data.
+In the last tutorial we saw how to create lots and lots of items. Sometimes, you think to yourself "that's way too many", and when you do, you simplify. Rougelike games have a tendency to have attributes associated with items. Commonly, "blessed", "normal", and "cursed". If we implemented this by detouring the item.RegisterItem() function, we would make 3 items for every 1 item in the game. Moreover, if you had 3 addons that each did this, the number of items would quickly explode to an unmanageable number. In this tutorial, we'll look at another method of giving items effects. Instead of creating items with names, we're going to override how items save and load themselves to give them a little extra data.
garrysmod/addons/artery\_rougelite/data/artery/global/item\_attributes.txt
diff --git a/tutorials/tut050_entities.md b/tutorials/tut050_entities.md
index e443cae..f223228 100644
--- a/tutorials/tut050_entities.md
+++ b/tutorials/tut050_entities.md
@@ -28,6 +28,9 @@ garrysmod/addons/artery\_rougelite/data/global/entity\_fountain.txt
scripted_ents.Register(ENT, "artery_fountain")
+### Alter
+
+Use mostly the same approach. You can skip this entity if you never went through @{tut042_too_many_items.md}
garrysmod/addons/artery\_rogelite/data/global/entity\_alter.txt
local ENT = scripted_ents.Get("prop_dynamic")
@@ -50,5 +53,36 @@ garrysmod/addons/artery\_rogelite/data/global/entity\_alter.txt
ply:GiveItem(item)
end
end
+
+ scripted_ents.Register(ENT, "artery_fountain")
It may have been tempting here to just set the item's .attribute in our iscursed() function, since it will be the first place we detect a cursed item. **HOWEVER!** There are a lot of places in Artery that this kind of thing can BREAK other addons. Generally speaking, try not to modify items while they're in an inventory. Remove them, modify them, then add them back.
+
+### Chest
+
+This one is pretty easy, it's really only here to show you how to extend the entities that are already in Artery.
+
+ local ENT = scripted_ents.Get("prop_dynamic")
+
+ DEFINE_BASECLASS("art_chest") -- this defines a local variable called BaseClass
+
+ function ENT:Initalize()
+ self:SetModel("models/props_junk/wood_crate002a.mdl")
+ end
+
+ function ENT:Use(ply)
+ --Get all the items the player has that are cursed
+ local iscursed = function(item)
+ if item.attribute == -1 then -- Item is cursed
+ return true
+ end
+ end
+ local to_uncurse_pos = ply:HasItem(iscursed)
+ while(to_uncurse_pos) do --Will be nil if we don't have any cursed items
+ local item = ply:RemoveItem(to_uncurse_pos)
+ item.attribute = nil
+ ply:GiveItem(item)
+ end
+ end
+
+ scripted_ents.Register(ENT, "artery_fountain")