Esempio n. 1
0
    public void Initialize(Entity entity, EntitiesHarvestableUI entitiesHarvestable)
    {
        float population;

        if (entity.population < 0)
        {
            population = 1;
        }
        else
        {
            population = Mathf.Floor(entity.population);
        }
        text.text   = "" + population + " " + entity.entitySO.name;
        this.entity = entity;
        this.entitiesHarvestable = entitiesHarvestable;

        foreach (Transform trans in ressourcesPreview.transform)
        {
            Destroy(trans.gameObject);
        }

        foreach (var res in entity.entitySO.resources)
        {
            ResourceTemplate temp = Instantiate(ressourcesTemplate, ressourcesPreview.transform);
            temp.icon.sprite = res.Key.icon;
            temp.value.text  = "" + res.Value.gain[entity.HarvestedBonus];
        }
    }
Esempio n. 2
0
        public void TestSchemaDependsOnWhenParametrizePropertiesOnlyIsTrue()
        {
            ResourceTemplate actual = GetSchema(true);

            Assert.AreEqual(1, actual.dependsOn.Count);
            Assert.AreEqual("[resourceId('Microsoft.ApiManagement/service/apis', parameters('service_dev_name'),'vita-gatan')]", actual.dependsOn[0].Value <string>());
        }
Esempio n. 3
0
 /// <summary>
 /// Put a resource template in the templates warehouse.
 /// </summary>
 /// <param name="template">Resource template.</param>
 public static void PutTemplate(ResourceTemplate template)
 {
     if (!templates.ContainsKey(template.ClassId))
     {
         templates.Add(template.ClassId, template);
     }
 }
        public string PrepareTemplate(ResourceTemplate resource)
        {
            var segments = new List <string>()
            {
                _generationRootFolder.FullName,
                "resourceTemplates",
            };

            var subSegments = resource.Template.Split('/', StringSplitOptions.RemoveEmptyEntries);

            segments.AddRange(subSegments.Take(subSegments.Length - 1));
            segments.Add(subSegments.Last() + ".yaml");

            var templatePath = Path.Combine(segments.ToArray());

            var template = ReadFileAsJson(templatePath);

            try
            {
                return(SubstituteParams(template, resource.Params));
            }
            catch (Exception e)
            {
                throw new Exception($"Can't substitute params in template: {resource.Template}", e);
            }
        }
Esempio n. 5
0
 public void AddResource(ResourceTemplate resource)
 {
     if (Resources.ContainsKey(resource.Key))
     {
         throw new MeException($"Duplicate resource {resource.Name}.");
     }
     Resources.Add(resource.Key, resource);
 }
Esempio n. 6
0
 public ResourceInstance(ResourceTemplate template, Entity parent)
 {
     Resource = template;
     Parent   = parent;
     Refresh();
     Value         = MaxAmount * Modifier;
     NextRegenTick = 0;
 }
Esempio n. 7
0
        public void AddResource(ResourceTemplate resource)
        {
            if (ResourceMap.ContainsKey(resource.Key))
            {
                return;
            }
            ResourceInstance resIn = new ResourceInstance(resource, this);

            ResourceMap.Add(resource.Key, resIn);
            RefreshProperties();
        }
Esempio n. 8
0
        ResourceTemplate ResourceFromJson(JToken json, ClassTemplate result)
        {
            string           resKey = json.Value <string>();
            ResourceTemplate res    = Engine.GetPropertyManager().GetResource(resKey);

            if (res == null)
            {
                throw new MeException($"Class {result.Name} references resource with key {resKey}, which does not exist.");
            }
            return(res);
        }
Esempio n. 9
0
        public static ResourceTemplate getMockHP(IGameEngine engine)
        {
            MeNode           max   = TreeConverter.Build("VIT*20", engine);;
            MeNode           regen = TreeConverter.Build("0", engine);
            ResourceTemplate hp    = new ResourceTemplate();

            hp.Formula       = max;
            hp.RegenFormula  = regen;
            hp.Key           = Entity.HP_KEY;
            hp.RegenInterval = new MeNode(GcConstants.Resources.DEFAULT_INTERVAL);
            return(hp);
        }
Esempio n. 10
0
        public void HandNestedIncludeWithPrefixDirs()
        {
            var   template = new ResourceTemplate(_lib, new FileBasedResourceLocator("Views"), new FileLocatorFactory(), "Home/Index.htm");
            ITile a        = new TemplateTile("a", template, new List <TileAttribute>());
            var   result   = a.Render(new TagModel(new Dictionary <string, string> {
                { "Message", "Test" }
            }));
            string expected = File.ReadAllText("expected_insert_template.htm");

            result   = CleanUp(result);
            expected = CleanUp("VIEWS" + expected);
            Assert.That(result, Is.EqualTo(expected));
        }
Esempio n. 11
0
        public void LoadResourcesFromPath(string path)
        {
            JArray         resourceJson = FileHandler.FromPath <JArray>(path);
            ResourceReader reader       = new ResourceReader(Engine);

            foreach (JToken resourceValue in resourceJson)
            {
                if (resourceValue.Type != JTokenType.Object)
                {
                    throw new MeException($"Expected a json object \"{path}\"at  \"{resourceValue}\".");
                }

                ResourceTemplate newResource = reader.FromJson(resourceValue.ToObject <JObject>());
                AddResource(newResource);
            }
        }
Esempio n. 12
0
        public bool FromJObject(JObject obj, IGameEngine engine)
        {
            string key = obj[GcConstants.General.KEY].ToObject <string>();

            if (!engine.GetPropertyManager().HasResource(key))
            {
                return(false);
            }
            ResourceTemplate template = engine.GetPropertyManager().GetResource(key);

            Resource = template;
            double value = obj[GcConstants.General.VALUE].ToObject <double>();

            Value = value;
            return(true);
        }
Esempio n. 13
0
        /// <summary>
        /// Get a template by type from the templates warehouse. If not in the warehouse, a new ResourceTemplate is created and added to the warehouse.
        /// </summary>
        /// <param name="type">.Net type.</param>
        /// <returns>Resource template.</returns>
        public static ResourceTemplate GetTemplate(Type type)
        {
            // loaded ?
            foreach (var t in templates.Values)
            {
                if (t.ClassName == type.FullName)
                {
                    return(t);
                }
            }

            var template = new ResourceTemplate(type);

            templates.Add(template.ClassId, template);

            return(template);
        }
Esempio n. 14
0
        public void ResourceReaderTestDefaultValues()
        {
            string  key      = "TEST_RES";
            JObject resource = new JObject();

            resource.Add(GcConstants.General.KEY, key);
            resource.Add(GcConstants.General.FORMULA, "VIT*20");

            ResourceTemplate res = Reader.FromJson(resource);

            Assert.AreEqual(key, res.Key);
            Assert.IsNotNull(res.Formula);
            Assert.AreEqual(GcConstants.Resources.DEFAULT_INTERVAL, res.RegenInterval.Value.ToLong());

            Assert.AreEqual(GcConstants.Resources.DEFAULT_REGEN, res.RegenFormula.Value.ToDouble());
            Assert.AreEqual(GcConstants.Resources.DEFAULT_MODIFIER, res.StartMod.Value.ToDouble());
        }
    protected override void OnInit(EventArgs e)
    {
        if (ResourceTemplate != null)
        {
            ScheduledResourceTemplate srt = new ScheduledResourceTemplate();
            plcResource.Controls.Add(srt);
            ResourceTemplate.InstantiateIn(srt);
        }

        if (SubNavTemplate != null)
        {
            ScheduledResourceSubNavTemplate snt = new ScheduledResourceSubNavTemplate();
            plcSubNav.Controls.Add(snt);
            SubNavTemplate.InstantiateIn(snt);
        }
        base.OnInit(e);
    }
Esempio n. 16
0
        public static void StartUp(TestContext ctx)
        {
            Definer.Instance().Engine     = Engine;
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key = "T";
            Engine.AddDamageType(trueDamage);
            ResourceTemplate mana = new ResourceTemplate();

            mana.Key = "MP";
            ResourceTemplate hp = new ResourceTemplate();

            hp.Key = Entity.HP_KEY;
            Engine.GetPropertyManager().AddResource(hp);
            Engine.GetPropertyManager().AddResource(mana);

            Engine.GetCoreManager().DefaultSkillThreat = GcConstants.Core.DEFAULT_THREAT;
        }
Esempio n. 17
0
    public void RefreshView()
    {
        for (int i = 0; i < sizePool; i++)
        {
            pool[i].gameObject.SetActive(false);
        }

        int index = 0;

        foreach (KeyValuePair <ResourceType, float> data in inv.resources)
        {
            ResourceTemplate template = pool[index++];
            template.icon.sprite           = data.Key.icon;
            template.value.text            = "" + data.Value;
            template.textPanel.text        = I18N.GetText(data.Key.infoboxPanel);
            template.textPanel.spriteAsset = data.Key.textIcons;
            template.gameObject.SetActive(true);
        }
    }
Esempio n. 18
0
        public static void StartUp(TestContext ctx)
        {
            Definer.Instance().Engine     = Engine;
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Name = "true";
            trueDamage.Key  = "T";
            Engine.AddDamageType(trueDamage);
            ResourceTemplate res = new ResourceTemplate()
            {
                Key = "MP"
            };
            SkillCost nullCost = new SkillCost(res, TreeConverter.Build("0", Engine));

            _testSkill      = new SkillTemplate();
            _testSkill.Type = SkillType.Cast;
            _testSkill.Key  = "TEST_CAST";
            SkillLevelTemplate testLevelTemplate = new SkillLevelTemplate();

            testLevelTemplate.Cooldown      = TreeConverter.Build("3", Engine);
            testLevelTemplate.Duration      = TreeConverter.Build($"{LConstants.SourceKeyword}{LConstants.PROP_OP}INT", Engine);
            testLevelTemplate.Interruptible = TreeConverter.Build("true", Engine);
            testLevelTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            testLevelTemplate.PushBack = TreeConverter.Build("true", Engine);
            testLevelTemplate.Cost     = nullCost;
            _testSkill.ByLevel.Add(testLevelTemplate);

            Engine.GetSkillManager().AddSkill(_testSkill);

            BaseObject bDmg = new BaseObject()
            {
                Description = "", Key = "BASE_DMG", Name = "Base damage"
            };

            Engine.GetPropertyManager().BaseValues.Add("BASE_DMG", bDmg);

            BaseObject intellect = new BaseObject()
            {
                Description = "", Key = "INT", Name = "Intellect"
            };

            Engine.GetPropertyManager().Attributes.Add("INT", intellect);
        }
Esempio n. 19
0
        public MockEntity(IGameEngine engine)
            : base(engine)
        {
            AddAttribute("VIT", 5);
            AddAttribute("STR", 5);
            AddAttribute("INT", 5);
            AddAttribute("AGI", 10);
            AddAttribute("DEF", 10);
            AddAttribute("MDEF", 10);
            AddResource(getMockHP(engine));
            MeNode           mpNode  = TreeConverter.Build("INT*10", engine);
            MeNode           mpRegen = TreeConverter.Build("INT/100", engine);
            ResourceTemplate resTemp = new ResourceTemplate();

            resTemp.Formula       = mpNode;
            resTemp.RegenFormula  = mpRegen;
            resTemp.Key           = "MP";
            resTemp.RegenInterval = new MeNode(GcConstants.Resources.DEFAULT_INTERVAL);
            AddResource(resTemp);
        }
Esempio n. 20
0
        public ResourceTemplate FromJson(JObject json)
        {
            ResourceTemplate result = new ResourceTemplate();

            result.LoadBase(json);

            //get formula for calculating max amount
            string maxValue = JsonUtils.ValidateJsonEntry(
                GcConstants.General.FORMULA,
                json,
                JTokenType.String,
                $"Unknown formula for resource {result.Name}").ToString();

            result.Formula = TreeConverter.Build(maxValue, Engine);

            //get formula for calculating regen
            string regenValue = JsonUtils.GetValueOrDefault(
                json,
                GcConstants.Resources.REGEN,
                GcConstants.Resources.DEFAULT_REGEN.ToString(CultureInfo.InvariantCulture));

            result.RegenFormula = TreeConverter.Build(regenValue, Engine);

            //get interval
            string intervalValue = JsonUtils.GetValueOrDefault <string>(json, GcConstants.Resources.INTERVAL, GcConstants.Resources.DEFAULT_INTERVAL.ToString());

            result.RegenInterval = TreeConverter.Build(intervalValue, Engine);

            //get modifier
            string modifierValue = JsonUtils.GetValueOrDefault <string>(
                json,
                GcConstants.Resources.MODIFIER,
                GcConstants.Resources.DEFAULT_MODIFIER.ToString());

            result.StartMod = TreeConverter.Build(modifierValue, Engine);

            return(result);
        }
Esempio n. 21
0
        public void EntityTestAddResource()
        {
            MockEntity       ent     = new MockEntity(Engine);
            ResourceTemplate resTemp = new ResourceTemplate();

            resTemp.Formula       = new MeNode(100);
            resTemp.RegenFormula  = new MeNode(0);
            resTemp.RegenInterval = new MeNode(0);
            resTemp.StartMod      = new MeNode(0);
            resTemp.Key           = "TEST_RES";
            resTemp.Name          = "Test Resource";
            resTemp.Description   = "";

            ent.AddResource(resTemp);
            ent.Key = "TEST_KEY";
            Assert.AreEqual(0, ent.GetProperty(resTemp.Key).Value);
            long amount = 50;

            Engine.AddPlayer(ent);
            string fromula = $"{LConstants.ADD_TO_RESOURCE_F}({ent.Key},{resTemp.Key},{amount})";

            TreeConverter.Build(fromula, Engine).Resolve();
            Assert.AreEqual(amount, ent.GetProperty(resTemp.Key).Value);
        }
Esempio n. 22
0
        public void ResourceReaderTestNonDefaultValues()
        {
            string  key      = "TEST_RES";
            JObject resource = new JObject();

            resource.Add(GcConstants.General.KEY, key);
            resource.Add(GcConstants.General.FORMULA, "VIT*20");
            long interval = 5;

            resource.Add(GcConstants.Resources.INTERVAL, interval);

            resource.Add(GcConstants.Resources.REGEN, "100/10");
            double mod = 1;

            resource.Add(GcConstants.Resources.MODIFIER, mod);
            ResourceTemplate res = Reader.FromJson(resource);

            Assert.AreEqual(key, res.Key);
            Assert.IsNotNull(res.Formula);
            Assert.AreEqual(interval, res.RegenInterval.Value.ToLong());

            Assert.AreEqual(10, res.RegenFormula.Resolve().Value.ToDouble());
            Assert.AreEqual(mod, res.StartMod.Value.ToDouble());
        }
Esempio n. 23
0
        public static void StartUp(TestContext context)
        {
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key  = "T";
            trueDamage.Name = "true";
            Engine.AddDamageType(trueDamage);
            ResourceTemplate res = new ResourceTemplate()
            {
                Key = "MP"
            };

            SkillCost nullCost = new SkillCost(res, TreeConverter.Build("0", Engine));
            SkillCost notFree  = new SkillCost(res, TreeConverter.Build("50", Engine));

            _testSkill      = new SkillTemplate();
            _testSkill.Type = SkillType.Cast;
            _testSkill.Key  = "TEST_CAST";
            SkillLevelTemplate testLevelTemplate = new SkillLevelTemplate();

            testLevelTemplate.Cooldown      = TreeConverter.Build("3", Engine);
            testLevelTemplate.Duration      = TreeConverter.Build($"{LConstants.SourceKeyword}{LConstants.PROP_OP}INT", Engine);
            testLevelTemplate.Interruptible = TreeConverter.Build("true", Engine);
            testLevelTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            testLevelTemplate.PushBack = TreeConverter.Build("true", Engine);
            testLevelTemplate.Cost     = nullCost;
            _testSkill.ByLevel.Add(testLevelTemplate);

            _testChannelSkill      = new SkillTemplate();
            _testChannelSkill.Type = SkillType.Channel;
            _testChannelSkill.Key  = "TEST_CHANNEL";
            SkillLevelTemplate testLevelTemplate2 = new SkillLevelTemplate();

            testLevelTemplate2.Cooldown      = TreeConverter.Build("120", Engine);
            testLevelTemplate2.Duration      = TreeConverter.Build("60", Engine);
            testLevelTemplate2.Interval      = TreeConverter.Build("10", Engine);
            testLevelTemplate2.PushBack      = TreeConverter.Build("true", Engine);
            testLevelTemplate2.Interruptible = TreeConverter.Build("true", Engine);
            testLevelTemplate2.Cost          = nullCost;
            MeNode channelFormula = TreeConverter.Build(
                $"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)",
                Engine);

            Engine.GetSanitizer().SetHarmsToPeriodic(channelFormula);

            testLevelTemplate2.Formulas.Add(channelFormula);
            _testChannelSkill.ByLevel.Add(testLevelTemplate2);

            _instantHarm      = new SkillTemplate();
            _instantHarm.Type = SkillType.Cast;
            _instantHarm.Key  = "HURT";
            SkillLevelTemplate hurtLevelTemplate = new SkillLevelTemplate();

            hurtLevelTemplate.Cooldown      = TreeConverter.Build("0", Engine);
            hurtLevelTemplate.Duration      = TreeConverter.Build("0", Engine);
            hurtLevelTemplate.PushBack      = TreeConverter.Build("false", Engine);
            hurtLevelTemplate.Interruptible = TreeConverter.Build("true", Engine);
            hurtLevelTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            hurtLevelTemplate.Cost = nullCost;
            _instantHarm.ByLevel.Add(hurtLevelTemplate);



            _unpushable      = new SkillTemplate();
            _unpushable.Type = SkillType.Cast;
            _unpushable.Key  = "NOPUSH";
            SkillLevelTemplate unpushTemplate = new SkillLevelTemplate();

            unpushTemplate.Cooldown      = TreeConverter.Build("0", Engine);
            unpushTemplate.Duration      = TreeConverter.Build("5", Engine);
            unpushTemplate.Interruptible = TreeConverter.Build("false", Engine);
            unpushTemplate.PushBack      = TreeConverter.Build("false", Engine);
            unpushTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            unpushTemplate.Cost = nullCost;
            _unpushable.ByLevel.Add(unpushTemplate);


            _costly      = new SkillTemplate();
            _costly.Type = SkillType.Cast;
            _costly.Key  = "COSTLY";
            SkillLevelTemplate costlyTemplate = new SkillLevelTemplate();

            costlyTemplate.Cooldown      = TreeConverter.Build("0", Engine);
            costlyTemplate.Duration      = TreeConverter.Build("0", Engine);
            costlyTemplate.Interruptible = TreeConverter.Build("true", Engine);
            costlyTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            costlyTemplate.PushBack = TreeConverter.Build("true", Engine);
            costlyTemplate.Cost     = notFree;
            _costly.ByLevel.Add(costlyTemplate);


            _skillUsingStat      = new SkillTemplate();
            _skillUsingStat.Type = SkillType.Cast;
            _skillUsingStat.Key  = "WITH_STAT";
            SkillLevelTemplate withStaTemplate = new SkillLevelTemplate();

            withStaTemplate.Cooldown      = TreeConverter.Build("0", Engine);
            withStaTemplate.Duration      = TreeConverter.Build("0", Engine);
            withStaTemplate.Interruptible = TreeConverter.Build("true", Engine);
            withStaTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10*{LConstants.SourceKeyword}{LConstants.PROP_OP}STR+{LConstants.GET_PROP_F}({LConstants.SourceKeyword},{BASE_VALUE}))", Engine));
            withStaTemplate.PushBack = TreeConverter.Build("true", Engine);
            withStaTemplate.Cost     = nullCost;

            _skillUsingStat.ByLevel.Add(withStaTemplate);
        }
Esempio n. 24
0
        /// <summary>
        /// Create new instance.
        /// </summary>
        /// <param name="id">Instance Id.</param>
        /// <param name="name">Name of the instance.</param>
        /// <param name="resource">Resource to manage.</param>
        /// <param name="store">Store responsible for the resource.</param>
        public Instance(uint id, string name, IResource resource, IStore store, ResourceTemplate customTemplate = null, ulong age = 0)
        {
            this.store       = store;
            this.resource    = resource;
            this.id          = id;
            this.name        = name;
            this.instanceAge = age;

            this.attributes     = new KeyList <string, object>(this);
            children            = new AutoList <IResource, Instance>(this);
            parents             = new AutoList <IResource, Instance>(this);
            managers            = new AutoList <IPermissionsManager, Instance>(this);
            children.OnAdd     += Children_OnAdd;
            children.OnRemoved += Children_OnRemoved;
            parents.OnAdd      += Parents_OnAdd;
            parents.OnRemoved  += Parents_OnRemoved;

            resource.OnDestroy += Resource_OnDestroy;

            if (customTemplate != null)
            {
                this.template = customTemplate;
            }
            else
            {
                this.template = Warehouse.GetTemplate(resource.GetType());
            }

            // set ages
            for (byte i = 0; i < template.Properties.Length; i++)
            {
                ages.Add(0);
                modificationDates.Add(DateTime.MinValue);
            }

            // connect events
            Type t = resource.GetType();

#if NETSTANDARD1_5
            var events = t.GetTypeInfo().GetEvents(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
#else
            var events = t.GetEvents(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
#endif

            foreach (var evt in events)
            {
                //if (evt.EventHandlerType != typeof(ResourceEventHanlder))
                //    continue;


                if (evt.EventHandlerType == typeof(ResourceEventHanlder))
                {
                    var ca = (ResourceEvent[])evt.GetCustomAttributes(typeof(ResourceEvent), true);
                    if (ca.Length == 0)
                    {
                        continue;
                    }

                    ResourceEventHanlder proxyDelegate = (args) => EmitResourceEvent(null, null, evt.Name, args);
                    evt.AddEventHandler(resource, proxyDelegate);
                }
                else if (evt.EventHandlerType == typeof(CustomResourceEventHanlder))
                {
                    var ca = (ResourceEvent[])evt.GetCustomAttributes(typeof(ResourceEvent), true);
                    if (ca.Length == 0)
                    {
                        continue;
                    }

                    CustomResourceEventHanlder proxyDelegate = (issuer, receivers, args) => EmitResourceEvent(issuer, receivers, evt.Name, args);
                    evt.AddEventHandler(resource, proxyDelegate);
                }


                /*
                 * else if (evt.EventHandlerType == typeof(CustomUsersEventHanlder))
                 * {
                 *  var ca = (ResourceEvent[])evt.GetCustomAttributes(typeof(ResourceEvent), true);
                 *  if (ca.Length == 0)
                 *      continue;
                 *
                 *  CustomUsersEventHanlder proxyDelegate = (users, args) => EmitResourceEvent(evt.Name, users, null, args);
                 *  evt.AddEventHandler(resource, proxyDelegate);
                 * }
                 * else if (evt.EventHandlerType == typeof(CustomConnectionsEventHanlder))
                 * {
                 *  var ca = (ResourceEvent[])evt.GetCustomAttributes(typeof(ResourceEvent), true);
                 *  if (ca.Length == 0)
                 *      continue;
                 *
                 *  CustomConnectionsEventHanlder proxyDelegate = (connections, args) => EmitResourceEvent(evt.Name, null, connections, args);
                 *  evt.AddEventHandler(resource, proxyDelegate);
                 * }
                 * else if (evt.EventHandlerType == typeof(CustomReceiversEventHanlder))
                 * {
                 *  var ca = (ResourceEvent[])evt.GetCustomAttributes(typeof(ResourceEvent), true);
                 *  if (ca.Length == 0)
                 *      continue;
                 *
                 *  CustomReceiversEventHanlder proxyDelegate = (users, connections, args) => EmitResourceEvent(evt.Name, users, connections, args);
                 *  evt.AddEventHandler(resource, proxyDelegate);
                 *
                 * }
                 */
            }
        }
Esempio n. 25
0
        public void TestSchema()
        {
            ResourceTemplate actual = GetSchema(false);

            Assert.IsNotNull(actual);
        }
Esempio n. 26
0
        /// <summary>
        /// Put a resource in the warehouse.
        /// </summary>
        /// <param name="resource">Resource instance.</param>
        /// <param name="name">Resource name.</param>
        /// <param name="store">IStore that manages the resource. Can be null if the resource is a store.</param>
        /// <param name="parent">Parent resource. if not presented the store becomes the parent for the resource.</param>
        public static void Put(IResource resource, string name, IStore store = null, IResource parent = null, ResourceTemplate customTemplate = null, ulong age = 0, IPermissionsManager manager = null)
        {
            resource.Instance = new Instance(resourceCounter++, name, resource, store, customTemplate, age);

            if (manager != null)
            {
                resource.Instance.Managers.Add(manager);
            }

            if (store == parent)
            {
                parent = null;
            }

            if (parent == null)
            {
                if (!(resource is IStore))
                {
                    store.Instance.Children.Add(resource);
                }
            }
            else
            {
                parent.Instance.Children.Add(resource);
            }



            if (resource is IStore)
            {
                stores.Add(resource as IStore);
                StoreConnected?.Invoke(resource as IStore, name);
            }
            else
            {
                store.Put(resource);
            }

            resources.Add(resource.Instance.Id, resource);

            if (!storeIsOpen)
            {
                resource.Trigger(ResourceTrigger.Initialize);
            }
        }
Esempio n. 27
0
        public ClassTemplate FromJson(JObject json)
        {
            ClassTemplate result = new ClassTemplate();

            result.LoadBase(json);

            AddBaseValueVector(GcConstants.Classes.BASE_VALUES, json, result, result.BasicValues);
            foreach (string baseV in result.BasicValues.Keys)
            {
                if (!Engine.GetPropertyManager().HasBaseValue(baseV))
                {
                    throw new MeException($"Class {result.Name} references unknown base value {baseV}.");
                }
            }

            foreach (BaseObject baseValue in Engine.GetPropertyManager().BaseValues.Values)
            {
                if (!result.BasicValues.ContainsKey(baseValue.Key))
                {
                    result.BasicValues.Add(baseValue.Key, 0);
                }
            }



            AddBaseValueVector(GcConstants.Classes.BASIC_ATTRIBUTES, json, result, result.Attributes);
            foreach (string baseV in result.Attributes.Keys)
            {
                if (!Engine.GetPropertyManager().HasAttribute(baseV))
                {
                    throw new MeException($"Class {result.Name} references unknown attribute {baseV}.");
                }
            }
            foreach (BaseObject attribute in Engine.GetPropertyManager().Attributes.Values)
            {
                if (!result.Attributes.ContainsKey(attribute.Key))
                {
                    result.Attributes.Add(attribute.Key, 0);
                }
            }

            JToken[] skills = JsonUtils.GetValueOrDefault <JToken[]>(json, GcConstants.Classes.SKILLS, null);
            if (skills != null)
            {
                foreach (JToken value in skills)
                {
                    SkillTemplate skill = SkillFromJson(value, result);
                    result.Skills.Add(skill.Key, skill);
                }
            }

            JToken        baseAttack = JsonUtils.ValidateJsonEntry(GcConstants.Classes.BASE_ATTACK, json, JTokenType.String, $"Class {result.Name} does not contain a {GcConstants.Classes.BASE_ATTACK} entry.");
            SkillTemplate baseSkill  = SkillFromJson(baseAttack, result);

            result.BaseAttack = baseSkill;

            JToken[] resources = JsonUtils.GetValueOrDefault <JToken[]>(json, GcConstants.Classes.RESOURCES, null);
            if (resources != null)
            {
                foreach (JToken value in resources)
                {
                    ResourceTemplate res = ResourceFromJson(value, result);
                    result.Resources.Add(res.Key, res);
                }
            }
            return(result);
        }
Esempio n. 28
0
        private uint processPacket(byte[] msg, uint offset, uint ends, NetworkBuffer data, int chunkId)
        {
            var packet = new IIPPacket();



            // packets++;

            if (ready)
            {
                var rt = packet.Parse(msg, offset, ends);
                //Console.WriteLine("Rec: " + chunkId + " " + packet.ToString());

                /*
                 * if (packet.Command == IIPPacketCommand.Event)
                 *  Console.WriteLine("Rec: " + packet.Command.ToString() + " " + packet.Event.ToString());
                 * else if (packet.Command == IIPPacketCommand.Report)
                 *  Console.WriteLine("Rec: " + packet.Command.ToString() + " " + packet.Report.ToString());
                 * else
                 *  Console.WriteLine("Rec: " + packet.Command.ToString() + " " + packet.Action.ToString() + " " + packet.ResourceId + " " + offset + "/" + ends);
                 */


                //packs.Add(packet.Command.ToString() + " " + packet.Action.ToString() + " " + packet.Event.ToString());

                //if (packs.Count > 1)
                //  Console.WriteLine("P2");

                if (rt <= 0)
                {
                    var size = ends - offset;
                    data.HoldFor(msg, offset, size, size + (uint)(-rt));
                    return(ends);
                }
                else
                {
                    offset += (uint)rt;

                    if (packet.Command == IIPPacket.IIPPacketCommand.Event)
                    {
                        switch (packet.Event)
                        {
                        case IIPPacket.IIPPacketEvent.ResourceReassigned:
                            IIPEventResourceReassigned(packet.ResourceId, packet.NewResourceId);
                            break;

                        case IIPPacket.IIPPacketEvent.ResourceDestroyed:
                            IIPEventResourceDestroyed(packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketEvent.PropertyUpdated:
                            IIPEventPropertyUpdated(packet.ResourceId, packet.MethodIndex, packet.Content);
                            break;

                        case IIPPacket.IIPPacketEvent.EventOccurred:
                            IIPEventEventOccurred(packet.ResourceId, packet.MethodIndex, packet.Content);
                            break;

                        case IIPPacketEvent.ChildAdded:
                            IIPEventChildAdded(packet.ResourceId, packet.ChildId);
                            break;

                        case IIPPacketEvent.ChildRemoved:
                            IIPEventChildRemoved(packet.ResourceId, packet.ChildId);
                            break;

                        case IIPPacketEvent.Renamed:
                            IIPEventRenamed(packet.ResourceId, packet.Content);
                            break;

                        case IIPPacketEvent.AttributesUpdated:
                            IIPEventAttributesUpdated(packet.ResourceId, packet.Content);
                            break;
                        }
                    }
                    else if (packet.Command == IIPPacket.IIPPacketCommand.Request)
                    {
                        switch (packet.Action)
                        {
                        // Manage
                        case IIPPacket.IIPPacketAction.AttachResource:
                            IIPRequestAttachResource(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketAction.ReattachResource:
                            IIPRequestReattachResource(packet.CallbackId, packet.ResourceId, packet.ResourceAge);
                            break;

                        case IIPPacket.IIPPacketAction.DetachResource:
                            IIPRequestDetachResource(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketAction.CreateResource:
                            IIPRequestCreateResource(packet.CallbackId, packet.StoreId, packet.ResourceId, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.DeleteResource:
                            IIPRequestDeleteResource(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacketAction.AddChild:
                            IIPRequestAddChild(packet.CallbackId, packet.ResourceId, packet.ChildId);
                            break;

                        case IIPPacketAction.RemoveChild:
                            IIPRequestRemoveChild(packet.CallbackId, packet.ResourceId, packet.ChildId);
                            break;

                        case IIPPacketAction.RenameResource:
                            IIPRequestRenameResource(packet.CallbackId, packet.ResourceId, packet.Content);
                            break;

                        // Inquire
                        case IIPPacket.IIPPacketAction.TemplateFromClassName:
                            IIPRequestTemplateFromClassName(packet.CallbackId, packet.ClassName);
                            break;

                        case IIPPacket.IIPPacketAction.TemplateFromClassId:
                            IIPRequestTemplateFromClassId(packet.CallbackId, packet.ClassId);
                            break;

                        case IIPPacket.IIPPacketAction.TemplateFromResourceId:
                            IIPRequestTemplateFromResourceId(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacketAction.QueryLink:
                            IIPRequestQueryResources(packet.CallbackId, packet.ResourceLink);
                            break;

                        case IIPPacketAction.ResourceChildren:
                            IIPRequestResourceChildren(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacketAction.ResourceParents:
                            IIPRequestResourceParents(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketAction.ResourceHistory:
                            IIPRequestInquireResourceHistory(packet.CallbackId, packet.ResourceId, packet.FromDate, packet.ToDate);
                            break;

                        // Invoke
                        case IIPPacket.IIPPacketAction.InvokeFunction:
                            IIPRequestInvokeFunction(packet.CallbackId, packet.ResourceId, packet.MethodIndex, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.GetProperty:
                            IIPRequestGetProperty(packet.CallbackId, packet.ResourceId, packet.MethodIndex);
                            break;

                        case IIPPacket.IIPPacketAction.GetPropertyIfModified:
                            IIPRequestGetPropertyIfModifiedSince(packet.CallbackId, packet.ResourceId, packet.MethodIndex, packet.ResourceAge);
                            break;

                        case IIPPacket.IIPPacketAction.SetProperty:
                            IIPRequestSetProperty(packet.CallbackId, packet.ResourceId, packet.MethodIndex, packet.Content);
                            break;

                        // Attribute
                        case IIPPacketAction.GetAllAttributes:
                            IIPRequestGetAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
                            break;

                        case IIPPacketAction.UpdateAllAttributes:
                            IIPRequestUpdateAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
                            break;

                        case IIPPacketAction.ClearAllAttributes:
                            IIPRequestClearAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
                            break;

                        case IIPPacketAction.GetAttributes:
                            IIPRequestGetAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
                            break;

                        case IIPPacketAction.UpdateAttributes:
                            IIPRequestUpdateAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
                            break;

                        case IIPPacketAction.ClearAttributes:
                            IIPRequestClearAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
                            break;
                        }
                    }
                    else if (packet.Command == IIPPacket.IIPPacketCommand.Reply)
                    {
                        switch (packet.Action)
                        {
                        // Manage
                        case IIPPacket.IIPPacketAction.AttachResource:
                            IIPReply(packet.CallbackId, packet.ClassId, packet.ResourceAge, packet.ResourceLink, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.ReattachResource:
                            IIPReply(packet.CallbackId, packet.ResourceAge, packet.Content);

                            break;

                        case IIPPacket.IIPPacketAction.DetachResource:
                            IIPReply(packet.CallbackId);
                            break;

                        case IIPPacket.IIPPacketAction.CreateResource:
                            IIPReply(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketAction.DeleteResource:
                        case IIPPacketAction.AddChild:
                        case IIPPacketAction.RemoveChild:
                        case IIPPacketAction.RenameResource:
                            IIPReply(packet.CallbackId);
                            break;

                        // Inquire

                        case IIPPacket.IIPPacketAction.TemplateFromClassName:
                        case IIPPacket.IIPPacketAction.TemplateFromClassId:
                        case IIPPacket.IIPPacketAction.TemplateFromResourceId:
                            IIPReply(packet.CallbackId, ResourceTemplate.Parse(packet.Content));
                            break;

                        case IIPPacketAction.QueryLink:
                        case IIPPacketAction.ResourceChildren:
                        case IIPPacketAction.ResourceParents:
                        case IIPPacketAction.ResourceHistory:
                            IIPReply(packet.CallbackId, packet.Content);
                            break;

                        // Invoke
                        case IIPPacket.IIPPacketAction.InvokeFunction:
                            IIPReplyInvoke(packet.CallbackId, packet.Content);

                            break;

                        case IIPPacket.IIPPacketAction.GetProperty:
                            IIPReply(packet.CallbackId, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.GetPropertyIfModified:
                            IIPReply(packet.CallbackId, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.SetProperty:
                            IIPReply(packet.CallbackId);
                            break;

                        // Attribute
                        case IIPPacketAction.GetAllAttributes:
                        case IIPPacketAction.GetAttributes:
                            IIPReply(packet.CallbackId, packet.Content);
                            break;

                        case IIPPacketAction.UpdateAllAttributes:
                        case IIPPacketAction.UpdateAttributes:
                        case IIPPacketAction.ClearAllAttributes:
                        case IIPPacketAction.ClearAttributes:
                            IIPReply(packet.CallbackId);
                            break;
                        }
                    }
                    else if (packet.Command == IIPPacketCommand.Report)
                    {
                        switch (packet.Report)
                        {
                        case IIPPacketReport.ManagementError:
                            IIPReportError(packet.CallbackId, AsyncReply.ErrorType.Management, packet.ErrorCode, null);
                            break;

                        case IIPPacketReport.ExecutionError:
                            IIPReportError(packet.CallbackId, AsyncReply.ErrorType.Exception, packet.ErrorCode, packet.ErrorMessage);
                            break;

                        case IIPPacketReport.ProgressReport:
                            IIPReportProgress(packet.CallbackId, AsyncReply.ProgressType.Execution, packet.ProgressValue, packet.ProgressMax);
                            break;

                        case IIPPacketReport.ChunkStream:
                            IIPReportChunk(packet.CallbackId, packet.Content);

                            break;
                        }
                    }
                }
            }

            else
            {
                var rt = authPacket.Parse(msg, offset, ends);

                //Console.WriteLine(session.LocalAuthentication.Type.ToString() + " " + offset + " " + ends + " " + rt + " " + authPacket.ToString());

                if (rt <= 0)
                {
                    data.HoldFor(msg, ends + (uint)(-rt));
                    return(ends);
                }
                else
                {
                    offset += (uint)rt;

                    if (session.LocalAuthentication.Type == AuthenticationType.Host)
                    {
                        if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Declare)
                        {
                            if (authPacket.RemoteMethod == IIPAuthPacket.IIPAuthPacketMethod.Credentials && authPacket.LocalMethod == IIPAuthPacket.IIPAuthPacketMethod.None)
                            {
                                Server.Membership.UserExists(authPacket.RemoteUsername, authPacket.Domain).Then(x =>
                                {
                                    if (x)
                                    {
                                        session.RemoteAuthentication.Username = authPacket.RemoteUsername;
                                        remoteNonce = authPacket.RemoteNonce;
                                        session.RemoteAuthentication.Domain = authPacket.Domain;
                                        SendParams((byte)0xa0, localNonce);
                                    }
                                    else
                                    {
                                        //Console.WriteLine("User not found");
                                        SendParams((byte)0xc0, (byte)1, (ushort)14, DC.ToBytes("User not found"));
                                    }
                                });
                            }
                        }
                        else if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Action)
                        {
                            if (authPacket.Action == IIPAuthPacket.IIPAuthPacketAction.AuthenticateHash)
                            {
                                var remoteHash = authPacket.Hash;

                                Server.Membership.GetPassword(session.RemoteAuthentication.Username,
                                                              session.RemoteAuthentication.Domain).Then((pw) =>
                                {
                                    if (pw != null)
                                    {
                                        var hashFunc = SHA256.Create();
                                        var hash     = hashFunc.ComputeHash(BinaryList.ToBytes(pw, remoteNonce, localNonce));
                                        if (hash.SequenceEqual(remoteHash))
                                        {
                                            // send our hash
                                            var localHash = hashFunc.ComputeHash(BinaryList.ToBytes(localNonce, remoteNonce, pw));

                                            SendParams((byte)0, localHash);

                                            readyToEstablish = true;
                                        }
                                        else
                                        {
                                            Global.Log("auth", LogType.Warning, "U:" + RemoteUsername + " IP:" + Socket.RemoteEndPoint.Address.ToString() + " S:DENIED");
                                            //Console.WriteLine("Incorrect password");
                                            SendParams((byte)0xc0, (byte)1, (ushort)5, DC.ToBytes("Error"));
                                        }
                                    }
                                });
                            }
                            else if (authPacket.Action == IIPAuthPacket.IIPAuthPacketAction.NewConnection)
                            {
                                if (readyToEstablish)
                                {
                                    var r = new Random();
                                    session.Id = new byte[32];
                                    r.NextBytes(session.Id);
                                    SendParams((byte)0x28, session.Id);
                                    ready = true;
                                    OnReady?.Invoke(this);
                                    Server.Membership.Login(session);

                                    Global.Log("auth", LogType.Warning, "U:" + RemoteUsername + " IP:" + Socket.RemoteEndPoint.Address.ToString() + " S:AUTH");
                                }
                            }
                        }
                    }
                    else if (session.LocalAuthentication.Type == AuthenticationType.Client)
                    {
                        if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Acknowledge)
                        {
                            remoteNonce = authPacket.RemoteNonce;

                            // send our hash
                            var hashFunc  = SHA256.Create();
                            var localHash = hashFunc.ComputeHash(BinaryList.ToBytes(localPassword, localNonce, remoteNonce));

                            SendParams((byte)0, localHash);
                        }
                        else if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Action)
                        {
                            if (authPacket.Action == IIPAuthPacket.IIPAuthPacketAction.AuthenticateHash)
                            {
                                // check if the server knows my password
                                var hashFunc   = SHA256.Create();
                                var remoteHash = hashFunc.ComputeHash(BinaryList.ToBytes(remoteNonce, localNonce, localPassword));

                                if (remoteHash.SequenceEqual(authPacket.Hash))
                                {
                                    // send establish request
                                    SendParams((byte)0x20, (ushort)0);
                                }
                                else
                                {
                                    SendParams((byte)0xc0, 1, (ushort)5, DC.ToBytes("Error"));
                                }
                            }
                            else if (authPacket.Action == IIPAuthPacket.IIPAuthPacketAction.ConnectionEstablished)
                            {
                                session.Id = authPacket.SessionId;

                                ready = true;
                                OnReady?.Invoke(this);
                            }
                        }
                        else if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Error)
                        {
                            OnError?.Invoke(this, authPacket.ErrorCode, authPacket.ErrorMessage);
                            Close();
                        }
                    }
                }
            }

            return(offset);

            //if (offset < ends)
            //  processPacket(msg, offset, ends, data, chunkId);
        }