public override void PreInit()
        {
            Weapon = GetComponent <IWeapon>();
            AddTag("Weapon");

            Damage           = Stats.AddStat(DamageInfo, BaseDamage);
            ProjectileAmount = Stats.AddStat(ProjectileAmountInfo, BaseProjectileAmount);
            Spread           = Stats.AddStat(SpreadInfo, BaseSpread);
            Speed            = Stats.AddStat(SpeedInfo, BaseSpeed);
            Firerate         = Stats.AddStat(FirerateInfo, BaseFirerate);

            OnFire               = Events.AddEvent(OnFireInfo);
            OnProjectile         = Events.AddEvent(OnProjectileInfo);
            OnProjectileDepleted = Events.AddEvent(OnProjectileDepletedInfo);
            OnProjectileHit      = Events.AddEvent(OnProjectileHitInfo);
            OnProjectileKill     = Events.AddEvent(OnProjectileKillInfo);

            Weapon.OnFire               += Weapon_OnFire;
            Weapon.OnProjectile         += Weapon_OnProjectile;
            Weapon.OnProjectileDepleted += Weapon_OnProjectileDepleted;
            Weapon.OnProjectileHit      += Weapon_OnProjectileHit;
            Weapon.OnProjectileKill     += Weapon_OnProjectileKill;

            Damage.OnChanged           += UpdateStats;
            ProjectileAmount.OnChanged += UpdateStats;
            Spread.OnChanged           += UpdateStats;
            Speed.OnChanged            += UpdateStats;
            Firerate.OnChanged         += UpdateStats;
        }
예제 #2
0
 public override void PreInit()
 {
     AddTag("Base");
     _onTargetAcquired = Events.AddEvent(OnTargetAcquiredInfo);
     Range = Stats.AddStat(RangeInfo, BaseRange);
 }
        static Tuple<EventBuilder, FieldBuilder> GenerateEvent(System.Reflection.Emit.TypeBuilder typeBuilder, IEventCaller @event)
        {
            var eventName = @event.Name;
            var eventHandlerType = @event.EventHandlerType;
            var eventHandlerTypes = new[] { eventHandlerType };

            var eventBackingField = typeBuilder.DefineField("m_" + eventName, eventHandlerType, FieldAttributes.Private);

            var voidType = typeof(void);

            //Combine event
            var add = typeBuilder.DefineMethod("add_" + eventName,
                                               VirtPublicProperty |
                                               MethodAttributes.Final |
                                               MethodAttributes.NewSlot,
                                               voidType,
                                               eventHandlerTypes);

            var generator = add.GetILGenerator();
            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldfld, eventBackingField);
            generator.Emit(OpCodes.Ldarg_1);
            generator.Emit(OpCodes.Call, _delegateCombine.Value);
            generator.Emit(OpCodes.Castclass, eventHandlerType);
            generator.Emit(OpCodes.Stfld, eventBackingField);
            generator.Emit(OpCodes.Ret);

            //Remove event
            var remove = typeBuilder.DefineMethod("remove_" + eventName,
                                                  VirtPublicProperty |
                                                  MethodAttributes.Final |
                                                  MethodAttributes.NewSlot,
                                                  voidType,
                                                  eventHandlerTypes);

            generator = remove.GetILGenerator();
            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldfld, eventBackingField);
            generator.Emit(OpCodes.Ldarg_1);
            generator.Emit(OpCodes.Call, _delegateRemove.Value);
            generator.Emit(OpCodes.Castclass, eventHandlerType);
            generator.Emit(OpCodes.Stfld, eventBackingField);
            generator.Emit(OpCodes.Ret);


            //event
            var eventBuilder = typeBuilder.DefineEvent(eventName, EventAttributes.None, eventHandlerType);
            eventBuilder.SetAddOnMethod(add);
            eventBuilder.SetRemoveOnMethod(remove);

            return Tuple.Create(eventBuilder, eventBackingField);
        }
 public override void Init()
 {
     OnTargetAcquired = Events.AddEvent(OnTargetAcquiredInfo);
     _mousePointer    = new GameObject("MousePointer").transform;
 }