private Mob(Map<String, Object> cfg)
	{
		super.setMapCfg(cfg);
		
		spawnChance = getAndSet("SpawnChance", 1);
		int maxAlive = getAndSet("MaxAlive", 0);
		int mobCooldown = getAndSet("MobCooldown", 60) * 1000;
		boolean enforceAllRemovalConditions = getAndSet("EnforceAllCooldownConditions", false);
		
		if (maxAlive > 0)
			maxAliveLimiter = new MobCounter(maxAlive, mobCooldown, enforceAllRemovalConditions);
		
		playerLimitGroup = getAndSet("PlayerLimitGroup", "").toLowerCase();
		regionLimitGroup = getAndSet("RegionLimitGroup", "").toLowerCase();
		heightOffset = getAndSet("HeightOffset", 0);
		bypassMobManagerLimit = getAndSet("BypassMobManagerLimit", false);
		bypassSpawnLimits = getAndSet("BypassPlayerAndRegionMobLimit", false);
		delayRequirementsCheck = getAndSet("DelayRequirementsCheck", false);
		
		mobType = ExtendedEntityType.valueOf(getAndSet("MobType", "UNKNOWN"));
		if (MMComponent.getAbilities().isEnabled())
		{
			String abilitySetName = getAndSet("AbilitySet", "default");
			abilitySet = abilitySetName.equalsIgnoreCase("default") ? null : AbilitySet.getAbilitySet(abilitySetName);
			if (abilitySetName.equalsIgnoreCase("default") && abilitySet == null)
				MMComponent.getSpawner().warning("Missing AbilitySet: " + abilitySetName);
			if (abilitySet != null && mobType == ExtendedEntityType.UNKNOWN)
				mobType = abilitySet.getAbilitySetsEntityType();
		}
		
		if (mobType == ExtendedEntityType.UNKNOWN)
		{
			super.clearCfg();
			return;
		}
		
		Map<String, Object> cfgMap = MiscUtil.copyConfigMap(getAndSet("Requirements", new LinkedHashMap<String, Object>()));
		requirements = new SpawnRequirements(cfgMap);
		set("Requirements", cfgMap);
		if (!requirements.required())
			requirements = null;
		
		cfgMap = MiscUtil.copyConfigMap(getAndSet("Action", new LinkedHashMap<String, Object>()));
		action = new Action(cfgMap);
		set("Action", cfgMap);
		
		super.clearCfg();
	}