示例#1
0
        protected override CodeCompileUnit CreateTargetCodeUnit()
        {
            CodeTypeDeclaration managerClass = NewClassWithMembers(SourceCodeLocator.Manager(Modname, Organization).ClassName);
            string hook = SourceCodeLocator.Hook(Modname, Organization).ClassName;

            managerClass.CustomAttributes.Add(NewAnnotation("Mod",
                                                            NewAnnotationArg("modid", NewFieldReferenceType(hook, "MODID")),
                                                            NewAnnotationArg("name", NewFieldReferenceType(hook, "NAME")),
                                                            NewAnnotationArg("version", NewFieldReferenceType(hook, "VERSION")),
                                                            NewAnnotationArg("acceptedMinecraftVersions", NewFieldReferenceType(hook, "ACCEPTEDVERSIONS"))
                                                            ));

            CodeMemberField instanceField = NewField(SourceCodeLocator.Manager(Modname, Organization).ClassName, "instance", MemberAttributes.Private | JavaAttributes.StaticOnly);

            instanceField.CustomAttributes.Add(NewInstanceAnnotation());
            managerClass.Members.Add(instanceField);

            CodeMemberField proxyField = NewField(SourceCodeLocator.CommonProxyInterface(Modname, Organization).ClassName, "proxy", MemberAttributes.Private | JavaAttributes.StaticOnly);

            proxyField.CustomAttributes.Add(NewAnnotation("SidedProxy",
                                                          NewAnnotationArg("clientSide", NewFieldReferenceType(hook, "CLIENTPROXYCLASS")),
                                                          NewAnnotationArg("serverSide", NewFieldReferenceType(hook, "SERVERPROXYCLASS"))
                                                          ));
            managerClass.Members.Add(proxyField);

            managerClass.Members.Add(NewField("Logger", "logger", MemberAttributes.Private | JavaAttributes.StaticOnly));

            managerClass.Members.Add(CretePreInitMethod());
            managerClass.Members.Add(CreateInitMethod());
            managerClass.Members.Add(CreateEmptyEventHandler("postInit", "FMLPostInitializationEvent"));
            managerClass.Members.Add(CreateEmptyEventHandler("serverStart", "FMLServerStartingEvent"));

            CodeMemberMethod getProxyMethod = NewMethod("getProxy", SourceCodeLocator.CommonProxyInterface(Modname, Organization).ClassName, MemberAttributes.Public | JavaAttributes.StaticOnly);

            getProxyMethod.Statements.Add(NewReturnVar("proxy"));
            managerClass.Members.Add(getProxyMethod);

            return(NewCodeUnit(SourceCodeLocator.Manager(Modname, Organization).PackageName, managerClass,
                               "net.minecraftforge.fml.common.Mod",
                               "net.minecraftforge.fml.common.SidedProxy",
                               "net.minecraftforge.fml.common.Mod.EventHandler",
                               "net.minecraftforge.fml.common.Mod.Instance",
                               "net.minecraftforge.fml.common.event.FMLInitializationEvent",
                               "net.minecraftforge.fml.common.event.FMLPostInitializationEvent",
                               "net.minecraftforge.fml.common.event.FMLPreInitializationEvent",
                               "net.minecraftforge.fml.common.event.FMLServerStartingEvent",
                               $"{SourceRootPackageName}.{SourceCodeLocator.Recipes(Modname, Organization).ImportRelativeName}",
                               $"{SourceRootPackageName}.{SourceCodeLocator.CommonProxyInterface(Modname, Organization).ImportRelativeName}",
                               "org.apache.logging.log4j.Logger"));
        }
        protected override CodeCompileUnit CreateTargetCodeUnit()
        {
            CodeCompileUnit unit = CreateDefaultTargetCodeUnit(ScriptLocator.ClassName, "Item");

            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.ItemBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.Materials(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.Hook(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.ItemBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.ArmorBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.BowBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.AxeBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.HoeBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.PickaxeBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.SpadeBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"{SourceRootPackageName}.{SourceCodeLocator.SwordBase(Modname, Organization).ImportRelativeName}"));
            unit.Namespaces[0].Imports.Add(NewImport($"java.util.ArrayList"));
            unit.Namespaces[0].Imports.Add(NewImport($"java.util.List"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.Item"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.Item.ToolMaterial"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.ItemArmor.ArmorMaterial"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.block.material.Material"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.init.SoundEvents"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.inventory.EntityEquipmentSlot"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.Item"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.ItemAxe"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.ItemHoe"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.ItemPickaxe"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.ItemSpade"));
            unit.Namespaces[0].Imports.Add(NewImport($"net.minecraft.item.ItemSword"));
            unit.Namespaces[0].Types[0].Members.Add(NewFieldGlobal("Item", "MODLOGO", NewObject("ItemBase", NewPrimitive("modlogo"))));
            foreach (Item item in Elements)
            {
                string newObjectType            = $"{item.Type.ToString()}Base";
                string baseObjectType           = null;
                List <CodeExpression> arguments = new List <CodeExpression>(2)
                {
                    NewPrimitive(item.Name.ToLower())
                };
                switch (item.Type)
                {
                case ItemType.Item:
                    baseObjectType = "Item";
                    arguments.Add(NewPrimitive(item.StackSize));
                    break;

                case ItemType.Hoe:
                    baseObjectType = "ItemHoe";
                    arguments.Add(NewPrimitive(item.Material));
                    break;

                case ItemType.Axe:
                    baseObjectType = "ItemAxe";
                    arguments.Add(NewPrimitive(item.Material));
                    break;

                case ItemType.Sword:
                    baseObjectType = "ItemSword";
                    arguments.Add(NewPrimitive(item.Material));
                    break;

                case ItemType.Spade:
                    baseObjectType = "ItemSpade";
                    arguments.Add(NewPrimitive(item.Material));
                    break;

                case ItemType.Pickaxe:
                    baseObjectType = "ItemPickaxe";
                    arguments.Add(NewPrimitive(item.Material));
                    break;

                case ItemType.Armor:
                    baseObjectType = "Item";
                    arguments.Add(NewPrimitive(item.Material));
                    switch (item.ArmorType)
                    {
                    case ArmorType.Helmet:
                        arguments.Add(NewPrimitive(1));
                        arguments.Add(NewSnippetExpression("EntityEquipmentSlot.HEAD"));
                        break;

                    case ArmorType.Chestplate:
                        arguments.Add(NewPrimitive(1));
                        arguments.Add(NewSnippetExpression("EntityEquipmentSlot.CHEST"));
                        break;

                    case ArmorType.Leggings:
                        arguments.Add(NewPrimitive(2));
                        arguments.Add(NewSnippetExpression("EntityEquipmentSlot.LEGS"));
                        break;

                    case ArmorType.Boots:
                        arguments.Add(NewPrimitive(1));
                        arguments.Add(NewSnippetExpression("EntityEquipmentSlot.FEET"));
                        break;

                    default:
                        throw new NotImplementedException($"{item.ArmorType} was not implemented");
                    }
                    break;

                default:
                    throw new NotImplementedException($"{item.Type} was not implemented");
                }
                CodeMemberField field = NewFieldGlobal(baseObjectType, item.Name.ToUpper(), NewObject(newObjectType, arguments.ToArray()));
                unit.Namespaces[0].Types[0].Members.Add(field);
                string jsonPath = Path.Combine(ModPaths.ModelsItemFolder(McMod.ModInfo.Name, McMod.Modid), item.Name.ToLower() + ".json");
                string parent   = item.Type == ItemType.Armor ? "generated" : "handheld";
                string jsonText = $@"
{{
    ""parent"": ""item/{parent}"",
    ""textures"": {{
                    ""layer0"": ""{McMod.Modid}:{item.TextureName}""
    }}
}}
";
                // TODO: Do not hard-code json
                File.WriteAllText(jsonPath, jsonText);
            }
            return(unit);
        }