diff --git a/Source/Core/ZDoom/ZScriptParser.cs b/Source/Core/ZDoom/ZScriptParser.cs index e2d119cd671ed019bf07b379a7a0f11087140049..2ffb113a9736d02ec1e79ce5e34b7ea461617e6a 100755 --- a/Source/Core/ZDoom/ZScriptParser.cs +++ b/Source/Core/ZDoom/ZScriptParser.cs @@ -1241,45 +1241,8 @@ namespace CodeImp.DoomBuilder.ZDoom } // Mixins. https://zdoom.org/wiki/ZScript_mixins - if (((ZScriptActorStructure)actor).Mixins.Count > 0) - { - foreach(string mixinclassname in ((ZScriptActorStructure)actor).Mixins) - { - if(!mixinclasses.ContainsKey(mixinclassname)) - { - LogWarning("Unable to find \"" + mixinclassname + "\" mixin class while parsing \"" + actor.ClassName + "\""); - continue; - } - - ZScriptClassStructure mixincls = mixinclasses[mixinclassname]; - - // States - if(actor.states.Count == 0 && mixincls.Actor.states.Count != 0) - { - // Can't use HasState and GetState here, because it does some magic that will not work for mixins - if (!actor.states.ContainsKey("spawn") && mixincls.Actor.states.ContainsKey("spawn")) - actor.states.Add("spawn", mixincls.Actor.GetState("spawn")); - } - - // Properties - if (!actor.props.ContainsKey("height") && mixincls.Actor.props.ContainsKey("height")) - actor.props["height"] = new List<string>(mixincls.Actor.props["height"]); - - if (!actor.props.ContainsKey("radius") && mixincls.Actor.props.ContainsKey("radius")) - actor.props["radius"] = new List<string>(mixincls.Actor.props["radius"]); - - // Flags - if (!actor.flags.ContainsKey("spawnceiling") && mixincls.Actor.flags.ContainsKey("spawnceiling")) - actor.flags["spawnceiling"] = true; - - if (!actor.flags.ContainsKey("solid") && mixincls.Actor.flags.ContainsKey("solid")) - actor.flags["solid"] = true; - - // user_ variables - foreach (string uservarname in mixincls.Actor.uservars.Keys) - actor.uservars[uservarname] = mixincls.Actor.uservars[uservarname]; - } - } + foreach(string mixinclassname in ((ZScriptActorStructure)actor).Mixins) + ApplyMixin(actor, mixinclassname); // Extensions. https://zdoom.org/wiki/ZScript_classes#Extending_Classes if (cls.Extensions.Count > 0) @@ -1291,9 +1254,13 @@ namespace CodeImp.DoomBuilder.ZDoom if (extenseionactor == null) continue; - // States - if (extenseionactor.states.ContainsKey("spawn")) - actor.states["spawn"] = extenseionactor.GetState("spawn"); + // Apply mixins to the extension class + foreach (string mixinclassname in ((ZScriptActorStructure)extenseionactor).Mixins) + ApplyMixin(extenseionactor, mixinclassname); + + // States + if (extenseionactor.states.ContainsKey("spawn")) + actor.states["spawn"] = extenseionactor.GetState("spawn"); // Properties if (extenseionactor.props.ContainsKey("height")) @@ -1349,6 +1316,43 @@ namespace CodeImp.DoomBuilder.ZDoom return true; } + private void ApplyMixin(ActorStructure actor, string mixinclassname) + { + if (!mixinclasses.ContainsKey(mixinclassname)) + { + LogWarning("Unable to find \"" + mixinclassname + "\" mixin class while parsing \"" + actor.ClassName + "\""); + return; + } + + ZScriptClassStructure mixincls = mixinclasses[mixinclassname]; + + // States + if (actor.states.Count == 0 && mixincls.Actor.states.Count != 0) + { + // Can't use HasState and GetState here, because it does some magic that will not work for mixins + if (!actor.states.ContainsKey("spawn") && mixincls.Actor.states.ContainsKey("spawn")) + actor.states.Add("spawn", mixincls.Actor.GetState("spawn")); + } + + // Properties + if (!actor.props.ContainsKey("height") && mixincls.Actor.props.ContainsKey("height")) + actor.props["height"] = new List<string>(mixincls.Actor.props["height"]); + + if (!actor.props.ContainsKey("radius") && mixincls.Actor.props.ContainsKey("radius")) + actor.props["radius"] = new List<string>(mixincls.Actor.props["radius"]); + + // Flags + if (!actor.flags.ContainsKey("spawnceiling") && mixincls.Actor.flags.ContainsKey("spawnceiling")) + actor.flags["spawnceiling"] = true; + + if (!actor.flags.ContainsKey("solid") && mixincls.Actor.flags.ContainsKey("solid")) + actor.flags["solid"] = true; + + // user_ variables + foreach (string uservarname in mixincls.Actor.uservars.Keys) + actor.uservars[uservarname] = mixincls.Actor.uservars[uservarname]; + } + #endregion #region ================== Methods