+McBack Posted August 19, 2009 Share Posted August 19, 2009 Tried to search but it didn't work, so I don't know if it's asked before. If I wan't to create zones, or change the size f a zone in mid game, how can I do it? Thanks McBack Quote Link to comment
Ranger Fox Posted August 19, 2009 Share Posted August 19, 2009 Just to clarify, you are aware anything dynamic like this requires you to edit directly the cartridge's lua code? Have you tried looking at the Whack-A-Lackey cartridge's source? It contains a lot of code to manipulate zones. I'll try to copy some of that code to this thread to answer your questions. Quote Link to comment
+me2d09 Posted August 19, 2009 Share Posted August 19, 2009 If you dont want to read all difficult source code, try this: 1) Put this code into author functions (after line -- #Author Functions Go Here# --) function GetNewZone(refPt, name, distance, direction, radius) local dist = Wherigo.Distance(distance, 'm') local newZp = Wherigo.TranslatePoint(refPt, dist, direction) dist = Wherigo.Distance(radius, 'm') local pts = { Wherigo.TranslatePoint(newZp, dist, 45), Wherigo.TranslatePoint(newZp, dist, 135), Wherigo.TranslatePoint(newZp, dist, 225), Wherigo.TranslatePoint(newZp, dist, 315), } local tempz = Wherigo.Zone{ Cartridge = cartCWGhideandseek, Name = name, OutOfRangeName = "", InRangeName = "", Description = [[]], Visible = false, Active = false, DistanceRange = Wherigo.Distance(-1, "m"), ShowObjects = "OnEnter", ProximityRange = Wherigo.Distance(10, "m"), AllowSetPositionTo = false, Points = pts, } return tempz end Now if you want to create a zone on the fly, use this syntax: GetNewZone(refPt, name, distance, direction, radius) where: refPt - reference position from where you want to measure distance name - name of the zone distance - from reference position to center of zone (in metres) direction - azimuth from reference position to center of new zone radius - radius of a new zone For example, if you want to create a zone 50 meter from your current position to the west, with name NewZone and radius 10 metres: GetNewZone(Player.ObjectLocation, "NewZone", 50, 270, 10) You cant write this code in official builder, use some simple text editor like notepad or for example PSPad with LUA syntax highlight. Quote Link to comment
+sTeamTraen Posted August 19, 2009 Share Posted August 19, 2009 You cant write this code in official builder, use some simple text editor like notepad or for example PSPad with LUA syntax highlight. It will shortly (next release, I hope) be possible to do all this in Earwigo, without having to "abandon" the builder. There will be a CodeMirror box with Lua syntax highlighting for your "Author Script" function definitions, and you can already put the call in any event handler with a "Lua statement" element. Quote Link to comment
Ranger Fox Posted August 19, 2009 Share Posted August 19, 2009 I see some others have contributed as well. I also saw me2d09 supplied a slightly modified function I created in Whack-A-Lackey. I've had my lunch break at work and was able to finish what I wanted to write, though I didn't get a chance to test my modifications. Now, if only I can get back to editing that announcement post I began writing on Sunday... ----------- Here are some specific functions from Whack-A-Lackey and how to use them. I made the functions generic enough so people can copy and paste them into their own cartridges with limited modification. First, you will need to create a ZonePoint within your game. A ZonePoint stores a coordinate pair and altitude. You will need to know and manipulate ZonePoints if you want to create zones. ReferencePoint = ZonePoint(40.07888,10.79488, 0) I had to edit this function to get it to do more along the line of what you wanted (I didn't test it). It will take in a ZonePoint (where you want to place the new zone), the zone's name, and a number representing the distance radius between the zone's center and edge. While the function will generate a square zone, you should be able to see how to edit it to make it more circular. function GetNewZone(newZp, name, radius) -- create a list of zone points local dist = Wherigo.Distance(radius, 'ft') local pts = { Wherigo.TranslatePoint(newZp, dist, 45), Wherigo.TranslatePoint(newZp, dist, 135), Wherigo.TranslatePoint(newZp, dist, 225), Wherigo.TranslatePoint(newZp, dist, 315), } -- create the new zone local tempz = Wherigo.Zone{ Cartridge = cartWhackALackey, Name = name, OutOfRangeName = "", InRangeName = "", Description = [[]], Visible = false, Active = false, DistanceRange = Wherigo.Distance(-1, "feet"), ShowObjects = "OnEnter", ProximityRange = Wherigo.Distance(30, "feet"), AllowSetPositionTo = false, Points = pts, } return tempz end So far, I have shown you how to create a zone in-game. Now, let's focus on changing a zone's size. One thing you'll have to remember is that a zone will not be updated without making it inactive. A good rule of thumb is to make it inactive, then change its properties, then make it active again. This will force the Player to recalculate and display the zone in its new location and/or dimensions. If you also plan to toggle the visibility, make sure to activate the zone before toggling visibility. The Garmin Oregon does not process a visibility change if the zone is inactive. This is in fact a Garmin problem, so Groundspeak can't do anything to correct it. To change a zone's dimensions, you'll have to replace its Points collection. I haven't tested this code, but I bet you could make a function based off the above code. function ResizeZone(z, radius) -- create a list of zone points local dist = Wherigo.Distance(radius, 'ft') local pts = { Wherigo.TranslatePoint(z.OriginalPoint, dist, 45), Wherigo.TranslatePoint(z.OriginalPoint, dist, 135), Wherigo.TranslatePoint(z.OriginalPoint, dist, 225), Wherigo.TranslatePoint(z.OriginalPoint, dist, 315), } -- resize the zone z.Points = pts end The trouble with the above code is I don't know if it'll work with dynamically-created zones. My previous function didn't set the zone's OriginalPoint property. Instead, all you have is a zone's Points collection. You don't know the zone's shape (you might, but a generic function won't), so you won't know its center point. You'll have to play around with it. Quote Link to comment
+McBack Posted August 19, 2009 Author Share Posted August 19, 2009 I understood that it had to be done "manually". Have checked the lua files a little already, so that's no problem (I hope) I'll try it. Thanks! sTeamTraen: I tried to search for the Earwigo, but I only came to a loginpage??? Quote Link to comment
+sTeamTraen Posted August 20, 2009 Share Posted August 20, 2009 sTeamTraen: I tried to search for the Earwigo, but I only came to a loginpage??? Ah, Google has found it. There's no automated signup. Send me a mail (not a forum PM) via my GC.com profile and I'll sign you up. Quote Link to comment
+fegan Posted September 4, 2009 Share Posted September 4, 2009 The Garmin Oregon does not process a visibility change if the zone is inactive. This is in fact a Garmin problem, so Groundspeak can't do anything to correct it. Ack! I wish I had read that earlier...I just published my 1st Wherigo and I have Activate before Visible when I'm shutting down a zone which has already been completed. Like I've always said, never get v1.0 of anything! Looks like I've got a quick re-build to submit before anyone downloads my cartridge. Thanks for sharing that bit of knowledge. Quote Link to comment
Ranger Fox Posted September 4, 2009 Share Posted September 4, 2009 Ack! I wish I had read that earlier...I just published my 1st Wherigo and I have Activate before Visible when I'm shutting down a zone which has already been completed. If you're shutting down a zone, it shouldn't matter (because you're making the zone inactive). However, following this logic, the zone will be visible the next time it is activated. So, in this respect, you should be fine. Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.