Page 24 of 117

Posted: Mon Jul 19, 2010 3:36 pm
by JensAyton
docwild wrote:
Is there a way to switch which dictionary entry applies to an existing object on the fly?
No.
docwild wrote:
If not, what is the effect of removing and replacing an entity which the player is docked at?
Probably quite messy.
docwild wrote:
Finally, I'm sure I read somewhere that it's possible, using the debug OXP and jScript console, to reload a worldscript on the fly. I can call the startup method which restarts the script already in memory, but is it possible to edit the script, and reload from within the game using the python debug console on linux?
Nope. You can, however, change the script’s handlers in memory:

Code: Select all

worldScripts["foo"].doSomething = function() { new code; }
Obviously you’d need to make corresponding changes in the file as well if you want them to stick.

Posted: Mon Jul 19, 2010 3:49 pm
by Arexack_Heretic
Ahruman wrote:
No, no, no!
Ah, I see. One needs to use this:

Code: Select all

<key>script_info</key>
<dict>
   <key>myCustomProperty</key>
   <string>0</string>
</dict>

Posted: Mon Jul 19, 2010 4:02 pm
by Thargoid
docwild wrote:
Is there a way to switch which dictionary entry applies to an existing object on the fly? If not, what is the effect of removing and replacing an entity which the player is docked at? I could use the shipWillDockWithStation () handler to switch before the ship docks or is it possible to create a station, switch the player to it before removing the original? Can it be switched during the shipWillLaunchFromStation() handler. I know there is a dockPlayer method (or something like that) but does it immediately dock the player or does it engage autopilot docking to said station?
If a station is destroyed whilst a player is docked in it then the player is automatically launched iirc. So presumably if it is script-removed the same would apply. Hence as soon as you try you'd possibly end up sat outside the new version of your station.

dockPlayer does just that - displays the docking rings and then the status screen. Basically the same as insta-docking (shift-D by standard keyboard mapping) when within the main station aegis (but can be used with any dockable entity). So probably not quite what you're looking for (a few extra ring sequences).

Looking at the trunk logs there may be a way to do this in 1.75 (something I plan to check when I get chance), but as a follow-up question, is there any reason the beacon code has to be read-only and not read-write settable (and removable) from script?

Editted to add - scratch the 1.75 thing, didn't work (beacons on sub-entites don't show up on the ASC).

Posted: Mon Jul 19, 2010 5:51 pm
by Svengali
Why not simply launching a buoy with beacon code then?

Posted: Mon Jul 19, 2010 6:14 pm
by Eric Walch
Svengali wrote:
Why not simply launching a buoy with beacon code then?
Yes, the GRC company faces bankruptcy because of the few buoys we can replace since introduction of 1.73. :lol: We need other sources to sell our buoys.

Look at the rock hermit locator. That one replaces buoys on the fly when the equipment gets damaged. That way all beacons are removed.

Posted: Mon Jul 19, 2010 6:49 pm
by docwild
You know, I hadn't considered buoys. Doh.

I'm sure there is a lot I'm doing which is misguided, but that's how you learn I guess.

Posted: Mon Jul 19, 2010 10:58 pm
by Kaks
Thargoid wrote:
as a follow-up question, is there any reason the beacon code has to be read-only and not read-write settable (and removable) from script?
As far as I know, it's the same reason that you cannot select/deselect specific missiles, or change player speed from script: the player needs to be - at least nominally - in control of its ship. If you play around with these things via script, the feeling of being in control tends to disappear fairly quickly... I wasn't around at the time, but I've got the feeling it probably was a bit touch and go for a while over making player.ship position & orientation modifiable by script...

Posted: Tue Jul 20, 2010 5:32 am
by Thargoid
Eh? How does being able to turn the broadcast beacon on and off on an NPC entity affect the player ship? Especially given it can be worked around by removing and replacing an entity to do it in a rather messy fashion?

Posted: Tue Jul 20, 2010 8:30 am
by Kaks
Maybe I misunderstood the question, but the beacon can be used (and I personally use it) in combat, and being able to switch it off at will does personally feel a step too far scriptwise... if the targeted entity is destroyed, and a similar one is put in its place, fair enough I suppose...
Not that I'm too confortable with the concept, mind.

If we consider the beacon display as a gps, changing the 'address' you want to go to under the player's feet does - again - feel like quite an underhand move too.

Physically destroying the 'address' and creating a new 'identical' one does at least reset the target, alerting the player that something is amiss... Anyway, these are my own personal opinions, don't really know what other devs think about it, etc... :)

Posted: Tue Jul 20, 2010 2:39 pm
by docwild
I tend to think of a beacon as a broadcast on a specific frequency, I can imagine that turning off the main station beacon via script would be a pain but perhaps a separate class of OXP beacons could be script controllable. At the moment it is fairly clunky, having to remove and replace entities on the fly to achieve the proper effect, making sure to store their stats (rotation, position, energy) before doing so. It isn't a vital thing nor is it particularly difficult to overcome, but it is one of those idiosyncrasies.

Code: Select all

this.updateBeacons = function ()
{
	if(this.playerClaimedMines.length > 0)
	{
		
		log(this.name, "UPDATEBEACONS");
		var mineEntity = system.shipsWithRole("slaveMine");
		//asteroids have been placed, now the owned ones need replacing
		for(var i = 0; i < mineEntity.length; i ++)
		{
			
			log(this.name, "updateBeacons: i = " + i);
			for(var n = 0; n < this.playerClaimedMines.length; n++)
			{
				var displayName = this.playerClaimedName[n];
				var position = Vector3D(this.playerClaimedPositions[n]);
				if(position.distanceTo(mineEntity[i].position) < 5)
				{
						//this is likely the one :P
						mineEntity[i].remove();
						var mineEntity2 = system.addShips("slaveMineOwned", 1, position, 1);
						if(mineEntity2)
						{
							mineEntity2[0].displayName = displayName;
							log(this.name, "replaced station n = " + n + " mineEntity2 = " + mineEntity2);
						}
						break;
				}
			}
		}
	}
}
Suggestions for improvement are welcomed. :D

Posted: Wed Jul 28, 2010 3:38 pm
by JensAyton
A potential problem that’s been bothering me for some time is that there’s no distinction between custom properties/methods on scripts and ones used by Oolite. This means that any new event handlers might conflict with some OXP’s private methods.

I’d like to suggest a convention (not an enforced rule) to get around this: custom properties on script objects intended for internal use or as APIs for other scripts should be prefixed with dollar signs. For instance, in the built-in Nova mission script, this.endTheMission would become this.$endTheMission and this.cleanUp would become this.$cleanUp.

custom properties added to anything other than your own script objects should still have an OXP-specific prefix.

Unless someone has a particular objection against this, I’ll be updating the built-in scripts accordingly soon.

Posted: Wed Jul 28, 2010 4:00 pm
by Kaks
Hmm, I'd use _ instead of $ as the suggested prefix for custom properties/methods myself.

The _ prefix is already fairly common for internal properties/methods, and the $ prefix is already fairly common - as far as js namespaces are concerned - to identify properties & methods from external libraries (jquery & prototype spring to mind).

Using $ for internal properties might well cause unnecessary confusion for any OXP maker already used to js... :)

Posted: Wed Jul 28, 2010 4:04 pm
by docwild
Plus: It would give me speccy BASIC flashbacks.

Posted: Wed Jul 28, 2010 4:12 pm
by JensAyton
Underscores are used for a variety of identifiers with special meanings to the interpreter. Well, OK, double underscores. But single underscores lead to double underscores, and eventually someone will think __count__ is a good name for a private property, and then the universe will explode in their face.

OK, so I’m a bit paranoid about namespaces. Somebody has to be.

Posted: Wed Jul 28, 2010 4:31 pm
by Kaks
Wait, if I understand the gist of what you're saying you'd rather confuse experienced js programmers because there's the remote possibility that non-js programmers could get confused by 'one _ at the front' and decide it actually means 'two _ at the front and two _ at the back', and - by pure chance - they come up with a name identical to an internal js property?

I'm happy to agree that someone confusing '_name' with '__name__' is a tiny bit more likely than confusing '$name' with '__name__', but either case is very, very unlikely, and would be 'a bit' of a stretch for them to say 'but Ahruman told me to write this property this way'.

And if the universe explodes because they use __count__ instead of the perfectly acceptable _count, well, they need to to take responsibility for their own actions.

I do think going against estabilished namespace practices is very counterintuitive, rather than paranoid, but hey, what do I know! :D