Sprache Deutsch Language English

Script Dokumentation LS 2015 - FieldDefinition (Patch 1.3)

Script Dokumentation Übersicht

scripts/objects/FieldDefinition.lua

Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
1-- FieldDefinition class
2--
3-- Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved.
4
5FieldDefinition = {}
6
7local FieldDefinition_mt = Class(FieldDefinition);
8
9function FieldDefinition:onCreate(id)
10 local fieldDefinition = FieldDefinition:new(id);
11 g_currentMission:addNonUpdateable(fieldDefinition);
12 g_currentMission.fieldDefinitionBase = fieldDefinition;
13 -- print("Created FieldDefinition, id: ", id);
14end;
15
16function FieldDefinition:new(name)
17 local self = {};
18 setmetatable(self, FieldDefinition_mt);
19
20 self.isInit = false;
21 self.numberOfFields = getNumOfChildren(name);
22 self.fieldDefs = {};
23 self.fieldDefsByFieldNumber = {};
24 self.unownedFields = {};
25
26 for i = 1, self.numberOfFields do
27 local currentFieldDef = getChildAt(name, i - 1);
28 local fieldDef = {};
29 fieldDef.rootNode = currentFieldDef;
30 fieldDef.fieldNumber = i;
31 fieldDef.fieldName = Utils.getNoNil(getUserAttribute(currentFieldDef, "fieldName"), "");
32 fieldDef.fieldArea = Utils.getNoNil(getUserAttribute(currentFieldDef, "fieldArea"), 2.5);
33 fieldDef.fieldPrice = Utils.getNoNil(getUserAttribute(currentFieldDef, "fieldPrice"), 50000);
34 fieldDef.fieldStartBid = Utils.getNoNil(getUserAttribute(currentFieldDef, "fieldStartBid"), fieldDef.fieldPrice / 2);
35 fieldDef.fieldBidStep = Utils.getNoNil(getUserAttribute(currentFieldDef, "fieldBidStep"), 1000);
36 fieldDef.fieldCurrentBid = fieldDef.fieldStartBid;
37 fieldDef.fieldHighestBidder = "nobody";
38-- fieldDef.fieldAuctionActive = false;
39 fieldDef.fieldBuyTrigger = getChildAt(currentFieldDef, 0);
40 fieldDef.fieldBuySymbol = getChildAt(fieldDef.fieldBuyTrigger, 0);
41 fieldDef.fieldDimensions = getChildAt(currentFieldDef, 1); -- this transformgroup's children define the field's location and dimensions
42 fieldDef.fieldMapIndicator = getChildAt(currentFieldDef, 2); -- this is where the field number appears on the PDA
43
44 -- add field number to PDA map
45 local x, _, z = getWorldTranslation(fieldDef.fieldMapIndicator);
46 fieldDef.fieldMapHotspot = g_currentMission.ingameMap:createMapHotspot(tostring(fieldDef.fieldNumber), "dataS2/menu/blank.png", x, z, 0, 0, false, false, true, 0);
47
48 -- field name overrides field number as the hotspot's displayed name
49 if fieldDef.fieldName ~= "" then
50 -- if field name is not in i18n, just take the name given via user attribute
51 local fieldName = fieldDef.fieldName;
52 local i18n = g_i18n;
53 if g_currentMission.missionInfo.customEnvironment ~= nil then
54 i18n = _G[g_currentMission.missionInfo.customEnvironment].g_i18n;
55 end
56 if i18n:hasText(fieldName) then
57 fieldName = i18n:getText(fieldName)
58 end;
59 fieldDef.fieldMapHotspot.name = fieldName;
60 end;
61
62 -- commented out: displaying field areas makes map too crowded
63 -- fieldDef.fieldMapHotspot.fullViewName = string.format("%d\n(%1.2f " .. g_i18n:getText("area_unit_short") .. ")", fieldDef.fieldNumber, fieldDef.fieldArea);
64
65 table.insert(self.fieldDefs, fieldDef);
66 self.fieldDefsByFieldNumber[i] = fieldDef; -- for convenience
67
68 fieldDef.ownedByPlayer = nil;
69 local isOwned = g_currentMission:getIsServer() and Utils.getNoNil(getUserAttribute(currentFieldDef, "ownedByPlayer"), false);
70 self:setFieldOwnedByPlayer(fieldDef, isOwned);
71 end;
72
73 self.currentField = nil; -- this points to the field def whose trigger the player is currently standing in
74
75 self.activateText = g_i18n:getText("PurchaseField");
76
77 self.isEnabled = true;
78 self.objectActivated = false;
79
80 return self;
81end;
82
83function FieldDefinition:delete()
84 if g_currentMission:getIsClient() then
85 for _, fieldDef in pairs(self.fieldDefs) do
86 removeTrigger(fieldDef.fieldBuyTrigger);
87 end;
88 end;
89 g_currentMission:removeActivatableObject(self);
90end;
91
92function FieldDefinition:init()
93 self.isInit = true;
94 for _, fieldDef in pairs(self.fieldDefs) do
95 if not fieldDef.ownedByPlayer then
96 self:updateFieldOwnedData(fieldDef);
97 end
98 end
99end
100
101function FieldDefinition:setFieldOwnedByPlayer(fieldDef, isOwned)
102 if fieldDef.ownedByPlayer ~= isOwned then
103 fieldDef.ownedByPlayer = isOwned;
104
105 if isOwned then
106 for i,unownedField in ipairs(self.unownedFields) do
107 if unownedField == fieldDef then
108 table.remove(self.unownedFields, i);
109 break;
110 end
111 end
112
113 setVisibility(fieldDef.fieldBuySymbol, false);
114 removeTrigger(fieldDef.fieldBuyTrigger);
115
116 if self.objectActivated and self.currentField == fieldDef then
117 self.objectActivated = false;
118 g_currentMission:removeActivatableObject(self);
119 end
120
121 fieldDef.fieldMapHotspot.baseColor = {0.25, 1, 0.25, 1};
122
123 -- throw player out of field dialog if he's currently got it open
124 if g_gui.currentGui ~= nil and g_gui.currentGuiName == "FieldDialog" and g_gui.currentGui.target.currentField == fieldDef then
125 g_gui.currentGui.target:onBackClick();
126 end;
127 else
128 setVisibility(fieldDef.fieldBuySymbol, true);
129 addTrigger(fieldDef.fieldBuyTrigger, "triggerCallback", self);
130 table.insert(self.unownedFields, fieldDef);
131 fieldDef.fieldMapHotspot.baseColor = {1, 1, 1, 1};
132 end
133
134 self:updateFieldOwnedData(fieldDef);
135 end
136end
137
138function FieldDefinition:updateFieldOwnedData(fieldDef)
139 if self.isInit then
140 local numDimensions = getNumOfChildren(fieldDef.fieldDimensions);
141 for i=1,numDimensions do
142 local dimWidth = getChildAt(fieldDef.fieldDimensions, i-1);
143 local dimStart = getChildAt(dimWidth, 0);
144 local dimHeight = getChildAt(dimWidth, 1);
145
146 local x,_,z = getWorldTranslation(dimStart);
147 local x1,_,z1 = getWorldTranslation(dimWidth);
148 local x2,_,z2 = getWorldTranslation(dimHeight);
149 g_currentMission:setIsFieldOwnedAtWorldParallelogram(x,z,x1,z1,x2,z2, fieldDef.ownedByPlayer);
150 end
151 end
152end
153
154function FieldDefinition:getIsActivatable()
155 return self.isEnabled and g_currentMission.controlPlayer;
156end;
157
158function FieldDefinition:drawActivate()
159 return;
160end;
161
162function FieldDefinition:onActivateObject()
163
164 if g_isDemo then
165 local infoDialog = g_gui:showGui("InfoDialog");
166 infoDialog.target:setText(g_i18n:getText("NotPossibleInDemo"));
167 infoDialog.target:setCallbacks(nil, nil, true);
168 else
169 if self.currentField ~= nil then
170 g_fieldDialog:setReturnScreen("");
171 g_gui:showGui("FieldDialog");
172 else
173 print("ERROR: current field def is nil");
174 end;
175 end;
176 self.objectActivated = true;
177 g_currentMission:addActivatableObject(self);
178end;
179
180function FieldDefinition:triggerCallback(triggerId, otherId, onEnter, onLeave, onStay)
181 if self.isEnabled then
182 if g_currentMission.player ~= nil and otherId == g_currentMission.player.rootNode then
183 if onEnter then
184 if not self.objectActivated then
185 for _, fieldDef in ipairs(self.fieldDefs) do
186 if fieldDef.fieldBuyTrigger == triggerId then
187 self.currentField = fieldDef;
188
189 g_currentMission:addActivatableObject(self);
190 self.objectActivated = true;
191 break;
192 end;
193 end;
194 end
195 elseif onLeave then
196 if self.objectActivated then
197 g_currentMission:removeActivatableObject(self);
198 self.objectActivated = false;
199 self.currentField = nil;
200 end
201 end;
202 end;
203 end;
204end;
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
Script Dokumentation Übersicht