MAKING SOMETHING LIGHT ENOUGH TO PICK UPOne of the first things I noticed was that Wolvy couldn't pick up a mere trash can. Well, things run a bit different by default in XML2, so to make objects that are light grab-able do the following.
1-Find the entry in the level's engb, as per the example below
entity {
classname = physent ;
deatheffect = base/material/break/brk_metal ;
deathsound = death_styles/ds_metal_hollow_s ;
fxlevel = 1 ;
health = 5 ;
heaviness = 1 ;
mass = 100 ;
material = hollow_metal ;
model = haarp/55galdrum ;
name = 55galdrum_ha ;
randompickups = 2 ;
structure = 0 ;
}
Change heaviness to 0. Now any character can pick it up.
FIXING ZONE TRANSITION ISSUESTo get the zone link to appear in the correct spot remove the orient line.
Original (the link to escape the level does not appear in the right spot):
entinst {
type = zone_link01 ;
inst {
orient = 0 0 -1.17481
name = zone_link01 ;
pos = 18 1794 0 ;
}
}
After the removal (it now works):
entinst {
type = zone_link01 ;
inst {
name = zone_link01 ;
pos = 18 1794 0 ;
}
}
FIXING BRIDGESTo make a bridge from xml1 work in mua, remove the following lines in the bridge entry in the level eng:
stopfly = ;
stophero = ;
stopnpcaltenemy = ;
stopnpcenemy = ;
stopnpcneutral = ;
stopwalk = ;
CONVERTING FIREBe sure that you copy the original
name = [name here] ; entry
entity {
actontouch = true ;
actrescheduledelay = 0.4 ;
actrescheduledelaymin = 0.4 ;
boxdamage = true ;
classname = affectableharment ;
damage = 3 ;
damagemods = dmgmod_no_pain ;
damagetype = dmg_fire ;
firstact = 1 ;
health = 1 ;
knockback = 200 ;
loopfx = map/common/fire_small ;
loopfxstarton = true ;
name = fire ;
reactpower = extinguish ;
spawnsoundloop = zone_shared/effects/fire_med ;
stophero = false ;
stopnpcaltenemy = false ;
stopnpcenemy = false ;
stopnpcneutral = false ;
targetlockable = true ;
}
to this one:
entity {
boxdamage = true ;
classname = affectableharment ;
damage = 3 5 ;
damagemods = dmgmod_no_pain dmgmod_unblockable ;
damagetype = dmg_fire ;
extent = -17 -17 0 17 17 28 ;
health = 1 ;
knockback = 200 ;
loopfx = map/common/fire_small ;
loopfxstarton = true ;
name = fire ;
radiusdamage = false ;
reactpower = extinguish ;
spawnsoundloop = zone_shared/effects/fire_med ;
stopprojectile = false ;
targetlockable = true ;
}
get the correct extent values from its entinst call. Also be sure you remove the structure = and smartfire = lines.
CONVERTING FIRE WALLSBe sure that you copy the original
name = [name here] ; entry
entity {
boxdamage = true ;
classname = affectableharment ;
damage = 3 ;
damagemods = dmgmod_no_pain ;
damagetype = dmg_fire ;
extent = -120 -65 0 120 65 90 ;
health = 1 ;
knockback = 200 ;
loopfx = map/common/fire_wall ;
loopfxstarton = true ;
name = fire_wall ;
radiusdamage = false ;
reactpower = extinguish ;
smartfire = true ;
spawnsoundloop = zone_shared/effects/fire_large ;
startenabled = true ;
stopprojectile = false ;
structure = 2 ;
targetlockable = true ;
}
an example of a working entity that is made to harm something (after conversion and editing to make it work):
entity {
boxdamage = true ;
classname = affectableharment ;
damage = 3 ;
damagemods = dmgmod_no_pain ;
damagetype = dmg_fire ;
extent = -14 -14 0 14 14 28 ;
health = 1 ;
knockback = 200 ;
loopfx = map/common/fire_wall ;
loopfxstarton = true ;
name = fire_wall ;
radiusdamage = false ;
reactpower = extinguish ;
spawnsoundloop = zone_shared/effects/fire_med ;
stopprojectile = false ;
targetlockable = true ;
}
CONVERTING OBJECTIVESOpen the specific mission file with a text editor. remove the first lines until the first entry and replace it with a line indicating the act the level is on (see below).
before
XMLB MISSION {
descname = Sentinel flashback. ;
description = Nightcrawler's Danger Room Flashback ;
keepheroes = false ;
mapload = ;
maxheros = 4 ;
minheros = 4 ;
remote = true ;
scriptstart = missions/mission_fmv_107 ;
skinset = 70s ;
teamselect = false ;
REQUIREDHERO {
name = nightcrawler ;
}
OBJECTIVE {
descname = Battle the Sentinel. ;
After
XMLB MISSION {
act = 1 ;
REQUIREDHERO {
name = nightcrawler ;
}
OBJECTIVE {
descname = Battle the Sentinel. ;
Now remove all entries that dont start with OBJECTIVE (i am not sure if they are compatible with Mua) (see below)
Before
XMLB MISSION {
act = 1 ;
REQUIREDHERO {
name = nightcrawler ;
}
OBJECTIVE {
descname = Battle the Sentinel. ;
After
XMLB MISSION {
act = 1 ;
OBJECTIVE {
descname = Battle the Sentinel. ;
Now remove all lines indicating xp, and replace them with rep (see below). Also add the line indicating whether the objective is optional or not, and add lines indicating the zone the mission will take place in, and add the line indicating that the type is normal (see below). You can also remove 'updatedescription' lines that dont actually contain information.
Before
OBJECTIVE {
descname = Battle the Sentinel. ;
description = Defeat the Sentinel in combat. ;
enabled = true ;
name = sentinel1 ;
updatedescription = ;
xp = 100 ;
}
After
OBJECTIVE {
descname = Battle the Sentinel. ;
description = Defeat the Sentinel in combat. ;
enabled = true ;
name = sentinel1 ;
optional = false ;
rep = 5 ;
type = normal ;
zone = nyc1 ;
}
Follow the steps above for all the OBJECTIVE entries. Now go to the last entry. It is usually the main objective. If it has a line indicating xp = ; just remove that line. You might need to change the name of the OBJECTIVE from a name with spaces to one without spaces (ex: Protect the city --> Protect_the_city). If it is the main objective you can add the line ' major = true ;' and remember the name of this OBJECTIVE, it will be used as the 'parentname'. Now go look at the objectives, if they are all descendents of the main objective add the line ' parentname = Protect_the_city ;' to all of them (not to the main objective itself of course). If there are multiple parents you can use multiple parentname lines. And MAKE SURE everything is still in ALPHABETICAL order.
Now save the file and compile it. Remember the filename. decompile and open data/missions/missions. Add an entry indicating your new objective (see below). Now save and compile it.
Before
XMLB MISSIONS {
maxmissions = 25 ;
maxquestsperact = 75 ;
maxtotalquests = 300 ;
MISSION {
name = act1_heli ;
}
MISSION {
name = act1_stark ;
}
After
XMLB MISSIONS {
maxmissions = 25 ;
maxquestsperact = 75 ;
maxtotalquests = 300 ;
MISSION {
name = sent_fb ;
}
MISSION {
name = act1_heli ;
}
MISSION {
name = act1_stark ;
}
Now decompile and open packages/generated/maps/package/missions. Add an entry for your new objective (see below). Save and compile.
Before
xml {
filename = data/missions/autotestquests ;
}
xml {
filename = data/missions/missions ;
}
}
After
xml {
filename = data/missions/autotestquests ;
}
xml {
filename = data/missions/missions ;
}
xml {
filename = data/missions/sent_fb ;
}
}
Now decompile and open data/zoneinfo. Look for the line 'objective_category' for your mission. Change it to point to your new objective (see below). Save and compile.
Before
texture = textures/zoneshot/act1_extract1 ;
towncenter = true ;
}
zone {
act = 1 ;
build = normal ;
extraction = true ;
loading = textures/loadingxmen/sentinel_fb ;
name = act1/fb/nyc1 ;
objective_category = act1_heli ;
savename = Seventh Ave. ;
start_game = true ;
state = 2 ;
}
zone {
act = 1 ;
After
texture = textures/zoneshot/act1_extract1 ;
towncenter = true ;
}
zone {
act = 1 ;
build = normal ;
extraction = true ;
loading = textures/loadingxmen/sentinel_fb ;
name = act1/fb/nyc1 ;
objective_category = sent_fb ;
savename = Seventh Ave. ;
start_game = true ;
state = 2 ;
}
zone {
act = 1 ;
Now, open your level eng's that will use this new objective file. Add the line 'act = x ;' to the first entity, where 'x' is the number of the act you added in the objective file (see below). Save and recompile your objective files.
Before
XMLB world {
entity {
extent_max = 3000 3240 360 ;
extent_min = 0 480 0 ;
level = 8 ;
name = world ;
After
XMLB world {
entity {
act = 1 ;
extent_max = 3000 3240 360 ;
extent_min = 0 480 0 ;
level = 8 ;
name = world ;
Now, if you changed any of the names in the mission file (ex: Protect_the_city) then you also have to change that name in all the scripts that refer to those objectives.
In some xml mission files, objectives contain counters, indicated by 'count = x'. If you do a straight conversion the way i described above, the counters wont appear in the objective menu, so you need to change a few things. You need to add to or overwrite the part in 'description' with the part in 'updatedescription' because the part in 'updatedescription' will not appear in the menu.
example:
Before
OBJECTIVE {
count = 2 ;
descname = Defeat the Sentinels. ;
description = Battle the Sentinels and destroy them. ;
enabled = false ;
name = sentinel2 ;
optional = false ;
parentname = Protect_the_city ;
rep = 5 ;
type = normal ;
updatedescription = You have defeated %d of %d Sentinels. ;
zone = nyc2 ;
}
After
OBJECTIVE {
count = 2 ;
descname = Defeat the Sentinels. ;
description = You have defeated %d of %d Sentinels. ;
enabled = false ;
name = sentinel2 ;
optional = false ;
parentname = Protect_the_city ;
rep = 5 ;
type = normal ;
updatedescription = Battle the Sentinels and destroy them. ;
zone = nyc2 ;
}
MAKING THINGS BREAKABLE (SUCH AS WALLS)to change walls (and possible other structures) to break, change the line in the entity from 'structure = x ;' to 'structure = 1 ;'
for example:
before (wall doesnt break)
entity {
classname = tileent ;
deatheffect = base/material/tile/tile_haarp_int ;
deathsound = death_styles/t_haarp_int ;
deathspawn = tile_hall_haarp ;
fxlevel = 3 ;
health = 100 ;
material = solid_metal ;
name = tile_hall_haarp ;
structure = 2 ;
tilemodelfolder = tiles/haarpint/ ;
}
After, wall breaks
entity {
classname = tileent ;
deatheffect = base/material/tile/tile_haarp_int ;
deathsound = death_styles/t_haarp_int ;
deathspawn = tile_hall_haarp ;
fxlevel = 3 ;
health = 100 ;
material = solid_metal ;
name = tile_hall_haarp ;
structure = 1 ;
tilemodelfolder = tiles/haarpint/ ;
}