Hallo,
wo legt Ihr die Einstellungen für ein AL-Script ab? Direkt in den Plugin-Daten oder in separaten globalen Variablen?
Beispiel:
Ich habe ein AL-Script geschrieben, dass von zeit zu zeit neue Asteroiden in zufälligen Sektoren erstellt.
In Plugin.Data habe ich bisher nur die Daten zu Scriptversion, Status, Playtime, Timer.
Weitere Einstellungen - Maximum Asteroiden pro Sektor, Minimum und Maximum Mineraliengehalt, wie viele Trümmer und so - habe ich bisher in globalen Variablen abgelegt. Diese Daten können vom Spieler verändert werden.
Könnte/Sollte ich diese Daten auch direkt in Plugin.Data ablegen? Was sind Vor- und Nachteile?
Hat da schon jemand Erfahrungen?
Danke und Grüsse
AL-Script::Frage: Daten in globalen Variablen oder in Plugin.Data speichern?
Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum
-
- Posts: 15
- Joined: Thu, 11. May 06, 23:59
-
- Moderator (Script&Mod)
- Posts: 14571
- Joined: Sun, 20. Nov 05, 22:45
Eigentlich sollte man so sparsam wie möglich mit globalen variablen umgehen, weil diese auch bestehen bleiben wenn das plagen irgendwann entfernt wird. Zudem kann es zu Konflikten bei den variablennamen kommen wenn du viele gv verwendest und andere mod-macher ne ähnliche Idee haben. Daher ist es gut mit diesen sparsam zu sein.
Auf der anderen Seite ist das Management von Werten in einem Array mit ein wenig mehr Aufwand verbunden als für jeden Zweck ne eigene Variable zu machen (und ne eigene Variable ist scriptübergreifend übersichtlicher)
Im Endeffekt würde ich sagen dass du es machen solltest wie du es besser findest - nutz aber bei eigenen gv eindeutiges prefix um variablenkonflikte zu vermeiden
Auf der anderen Seite ist das Management von Werten in einem Array mit ein wenig mehr Aufwand verbunden als für jeden Zweck ne eigene Variable zu machen (und ne eigene Variable ist scriptübergreifend übersichtlicher)
Im Endeffekt würde ich sagen dass du es machen solltest wie du es besser findest - nutz aber bei eigenen gv eindeutiges prefix um variablenkonflikte zu vermeiden

if not stated otherwise everything i post is licensed under WTFPL
Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter
I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help
Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help

-
- Posts: 1379
- Joined: Fri, 21. Mar 14, 20:51
Re: AL-Script::Frage: Daten in globalen Variablen oder in Plugin.Data speichern?
... ich persönlich pack gern alles in 1 array, dass global gespeichert wirdSaburac wrote:... wo legt Ihr die Einstellungen für ein AL-Script ab? Direkt in den Plugin-Daten oder in separaten globalen Variablen?
... ist aber von typ zu typ unterschiedlich, richtig oder falsch gibts da nich' ^^
... pro / contra ?? ich kenn keine ... ist mMn nur ne sache des geschmacksSaburac wrote:Könnte/Sollte ich diese Daten auch direkt in Plugin.Data ablegen? Was sind Vor- und Nachteile?
soweit ich weiß machen globale vars nur (performance-) probleme, wenn man die zu häufig im mission director nutzt (sagt zumindest ketraar)
kannst dir ja mal anschauen, wie ich soo von prinzip her ALPs gestalten würd:
Code: Select all
Script al.plugin.template.register
Version: 1
for Script Engine Version: 53
Description
--- AL PlugIn: Registration ---
Arguments
Source Text
001
002 al engine: register script='al.plugin.template.events'
003
004 return null
005
Code: Select all
Script al.plugin.template.events
Version: 1
for Script Engine Version: 53
Description
--- AL PlugIn: Event Handler ---
Arguments
1: Plugin.ID , Var/String , 'Plugin ID'
2: Plugin.Event , Var/String , 'Plugin Event'
Source Text
001
002 skip if is datatype[ $Plugin.Event ] == DATATYPE_STRING
003 |return null
004
005 gosub Get.Constants
006
007 $Plugin.ID = get script name
008 $Plugin.Data = get global variable: name=$Plugin.ID
009 $Script.Version = get script version
010
011
012 * ===========================================
013 if $Plugin.Event == $Event.Init OR $Plugin.Event == $Event.Reinit
014 |
015 |load text: id=$Page.ID
016 |
017 |if not is datatype[ $Plugin.Data ] == DATATYPE_ARRAY
018 ||$Plugin.Data = array alloc: size=10
019 ||set global variable: name=$Plugin.ID value=$Plugin.Data
020 ||$Plugin.Data[$Index.Name] = $Plugin.Name.Default
021 ||$Plugin.Data[$Index.State] = [FALSE]
022 ||$Plugin.Data[$Index.Version] = $Script.Version
023 ||$Plugin.Data[$Index.Timer] = 300
024 ||$Plugin.Timer = $Plugin.Data[$Index.Timer]
025 ||$Time.Next.Timer.Event = $Time + $Plugin.Timer
026 ||$Plugin.Data[$Index.Timer.Next] = $Time.Next.Timer.Event
027 * ... ggf sonstige dinge die man speichern will
028 |end
029 |
030 |$Plugin.Name = $Plugin.Data[$Index.Name]
031 |$Plugin.Timer = $Plugin.Data[$Index.Timer]
032 |al engine: set plugin $Plugin.ID description to $Plugin.Name
033 |al engine: set plugin $Plugin.ID timer interval to $Plugin.Timer s
034 |
035 |gosub Updates
036 |gosub Init.Event
037 |
038 else if $Plugin.Event == $Event.Start OR $Plugin.Event == $Event.Stop
039 |
040 |goto label Setup.Menu
041 |
042 else if $Plugin.Event == $Event.Isenabled
043 |
044 |$Plugin.State = $Plugin.Data[$Index.State]
045 |return $Plugin.State
046 |
047 else if $Plugin.Event == $Event.Timer
048 |
049 |$Plugin.Timer = $Plugin.Data[$Index.Timer]
050 |$Time.Next.Timer.Event = $Time + $Plugin.Timer
051 |$Plugin.Data[$Index.Timer.Next] = $Time.Next.Timer.Event
052 |
053 |do if $Plugin.Data[$Index.State]
054 ||gosub Timer.Event
055 |
056 end
057 * ===========================================
058
059 return null
060
061
062
063 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
064
065 Get.Constants:
066
067 $Null = null
068
069 $Page.ID = 1234
070
071 * zur ausgabe von informationen ins verzeichnis ".../Dokumente/Egosoft/12345.txt"
072 $Log.File = 12345
073
074 $Event.Init = 'init'
075 $Event.Reinit = 'reinit'
076 $Event.Start = 'start'
077 $Event.Stop = 'stop'
078 $Event.Isenabled = 'isenabled'
079 $Event.Timer = 'timer'
080
081 $Index.Name = 0
082 $Index.State = 1
083 $Index.Version = 2
084 $Index.Timer = 3
085 $Index.Timer.Next = 4
086
087 $Plugin.Name.Default = 'TEMPLATE AL PLUGIN'
088
089 $Time = playing time
090
091 endsub
092
093 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
094
095
096
097 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
098
099 Updates:
100
101 $Script.Version.Saved = $Plugin.Data[$Index.Version]
102 skip if $Script.Version > $Script.Version.Saved
103 |endsub
104
105 START speak text: page=13 id=1332 priority=99
106
107 * ... updates kommen hier hin, damit kann man vorherige versionen korrigieren
108
109
110
111
112
113
114
115 endsub
116
117 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
118
119
120
121 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
122
123 Setup.Menu:
124
125 * menue vorbereiten
126 skip if is datatype[ $Menu ] == DATATYPE_ARRAY
127 |$Menu = create custom menu array
128
129 resize array $Menu to 0
130
131 $Text.1 = 'AL Plugin Einstellungen'
132 add custom menu heading to array $Menu: title=$Text.1
133
134 * menue kleiner halten, dass es nicht bis ganz nach unten geht
135 set menu option: $Menu, maximum menu height=27 lines
136
137
138 * menue punkt zum veraendern des al plugin name
139 $Text.1 = 'Name'
140 $Plugin.Name = $Plugin.Data[$Index.Name]
141 $Text.1 = create text for custom menu, left=$Text.1, right=$Plugin.Name
142 add custom menu item to array $Menu: text=$Text.1 returnvalue='RENAME'
143
144
145 * menue punkt zum starten / stoppen des al plugins
146 $Text.1 = 'Status'
147 $Text.2 = 'eingeschaltet'
148 skip if $Plugin.Data[$Index.State]
149 |$Text.2 = 'ausgeschaltet'
150 $Text.1 = create text for custom menu, left=$Text.1, right=$Text.2
151 add custom menu item to array $Menu: text=$Text.1 returnvalue='ON_OFF'
152
153
154 * menue punkt zum veraendern des al plugin timers
155 $Text.1 = 'AL Timer'
156 $Plugin.Timer = $Plugin.Data[$Index.Timer]
157 $Text.2 = format time: $Plugin.Timer
158 $Text.1 = create text for custom menu, left=$Text.1, right=$Text.2
159 add custom menu item to array $Menu: text=$Text.1 returnvalue='TIMER'
160
161
162 * menue punkt zur info wan der naechste timer event kommt
163 $Text.1 = 'verbleibende Zeit'
164 $Time = playing time
165 $Time.Next.Timer.Event = $Plugin.Data[$Index.Timer.Next]
166 $Time.Next.Timer.Event = $Time.Next.Timer.Event - $Time
167 $Text.2 = format time: $Time.Next.Timer.Event
168 $Text.1 = create text for custom menu, left=$Text.1, right=$Text.2
169 add custom menu item to array $Menu: text=$Text.1 returnvalue=null
170
171
172 * sonstige menue punkte ... hier
173
174
175 * menue anzeigen ...
176 $Text.1 = $Plugin.Name
177 $Text.2 = sprintf: fmt='%s', [PLAYERSHIP], null, null, null, null
178 $Return = open custom menu: title=$Text.1 description=$Text.2 option array=$Menu
179
180
181 * menue handling ...
182 if $Return == -1 OR $Return == null
183 |return null
184 |
185 else if $Return == 'RENAME'
186 |$Text.1 = 'Neuer Name eingeben:'
187 |$Plugin.Name = [PLAYERSHIP] -> get user input: type=String, title=$Text.1
188 |if is datatype[ $Plugin.Name ] == DATATYPE_STRING
189 ||$Text.1 = $Plugin.Name
190 ||while get length of string $Text.1
191 |||$Text.2 = get substring of $Text.1 offset=0 length=1
192 |||skip if $Text.2 == ' '
193 ||||break
194 |||$Text.2 = get length of string $Text.1
195 |||dec $Text.2 =
196 |||$Text.1 = get substring of $Text.1 offset=1 length=$Text.2
197 ||end
198 ||if get length of string $Text.1
199 |||$Plugin.Data[$Index.Name] = $Plugin.Name
200 |||al engine: set plugin $Plugin.ID description to $Plugin.Name
201 ||else
202 |||$Text.1 = 'AL Plugin Name muss erkennbar sein!'
203 |||display subtitle text: text=$Text.1 duration=5000 ms
204 ||end
205 |end
206 |
207 else if $Return == 'ON_OFF'
208 |if $Plugin.Data[$Index.State]
209 ||$Plugin.Data[$Index.State] = [FALSE]
210 ||$Text.2 = 'ausgeschaltet'
211 |else
212 ||$Plugin.Data[$Index.State] = [TRUE]
213 ||$Text.2 = 'eingeschaltet'
214 |end
215 |$Text.1 = $Plugin.Name + ' ' + $Text.2
216 |display subtitle text: text=$Text.1 duration=5000 ms
217 |
218 else if $Return == 'TIMER'
219 |$Text.1 = 'Timer in Sekunden eingeben:'
220 |$Plugin.Timer = [PLAYERSHIP] -> get user input: type=Number, title=$Text.1
221 |if is datatype[ $Plugin.Timer ] == DATATYPE_INT
222 ||if $Plugin.Timer >= 60
223 |||$Plugin.Data[$Index.Timer] = $Plugin.Timer
224 |||al engine: set plugin $Plugin.ID timer interval to $Plugin.Timer s
225 ||else
226 |||$Text.1 = 'Timer muss mindestens 60 Sekunden sein!'
227 |||display subtitle text: text=$Text.1 duration=5000 ms
228 ||end
229 |end
230 |
231 else if $Return == '... whatever'
232 * ... hier kann man das menue handling beliebig erweitern
233 |
234 |
235 end
236
237 goto label Setup.Menu
238
239 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
240
241
242
243 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
244
245 Init.Event:
246
247 * ... zum einbinden von kommandos
248
249
250
251
252
253 endsub
254
255 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
256
257
258
259 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
260
261 Timer.Event:
262
263 * ... sobald der timer abgelaufen ist, wird dies ausgefuehrt (wenn AL enabled)
264
265
266
267
268
269
270 endsub
271
272 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
273
274
275 return null
276

=> auch kann man nachträglich n menüpunkt zum löschen des plugins einbauen
=> das datenarray kann ebenso später erweitert werden
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.
Mission Director Beispiele
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.
Mission Director Beispiele
-
- Posts: 15
- Joined: Thu, 11. May 06, 23:59