Upload from upload_mods.ps1
This commit is contained in:
379
Scripts/Blocks/BlockSpawnEntityRebirth.cs
Normal file
379
Scripts/Blocks/BlockSpawnEntityRebirth.cs
Normal file
@@ -0,0 +1,379 @@
|
||||
public class BlockSpawnEntityRebirth : BlockMotionSensor
|
||||
{
|
||||
private int OwnerID = -1;
|
||||
private float _tickRate = 10UL;
|
||||
private int _maxSpawned = 1;
|
||||
private int _numberToSpawn = 1;
|
||||
private int _spawnRadius = 0;
|
||||
private int _spawnArea = 15;
|
||||
|
||||
private string _entityGroup = "";
|
||||
private string _signText = "";
|
||||
|
||||
private EntityAlive entityPlaced;
|
||||
|
||||
public override void OnBlockPlaceBefore(WorldBase _world, ref BlockPlacement.Result _bpResult, EntityAlive _ea, GameRandom _rnd)
|
||||
{
|
||||
entityPlaced = _ea;
|
||||
}
|
||||
|
||||
public override void Init()
|
||||
{
|
||||
base.Init();
|
||||
if (Properties.Values.ContainsKey("TickRate"))
|
||||
Properties.ParseFloat("TickRate", ref _tickRate);
|
||||
if (Properties.Values.ContainsKey("MaxSpawned"))
|
||||
Properties.ParseInt("MaxSpawned", ref _maxSpawned);
|
||||
if (Properties.Values.ContainsKey("NumberToSpawn"))
|
||||
Properties.ParseInt("NumberToSpawn", ref _numberToSpawn);
|
||||
if (Properties.Values.ContainsKey("SpawnRadius"))
|
||||
Properties.ParseInt("SpawnRadius", ref _spawnRadius);
|
||||
if (Properties.Values.ContainsKey("SpawnArea"))
|
||||
Properties.ParseInt("SpawnArea", ref _spawnArea);
|
||||
if (Properties.Values.ContainsKey("EntityGroup"))
|
||||
_entityGroup = Properties.Values["EntityGroup"];
|
||||
|
||||
if (Properties.Values.ContainsKey("Config"))
|
||||
_signText = Properties.Values["Config"];
|
||||
|
||||
}
|
||||
public override string GetActivationText(WorldBase _world, BlockValue _blockValue, int _clrIdx, Vector3i _blockPos, EntityAlive _entityFocusing)
|
||||
{
|
||||
return "";
|
||||
|
||||
}
|
||||
|
||||
public override bool CanPlaceBlockAt(WorldBase _world, int _clrIdx, Vector3i _blockPos, BlockValue _blockValue, bool _bOmitCollideCheck = false)
|
||||
{
|
||||
|
||||
EntityPlayerLocal primaryPlayer = GameManager.Instance.World.GetPrimaryPlayer();
|
||||
|
||||
if (primaryPlayer != null)
|
||||
{
|
||||
}
|
||||
|
||||
if (_blockPos.y > 253)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!GameManager.Instance.IsEditMode() && ((World)_world).IsWithinTraderArea(_blockPos))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Block block = _blockValue.Block;
|
||||
return (!block.isMultiBlock || _blockPos.y + block.multiBlockPos.dim.y < 254) && (GameManager.Instance.IsEditMode() || _bOmitCollideCheck || !this.overlapsWithOtherBlock(_world, _clrIdx, _blockPos, _blockValue));
|
||||
}
|
||||
|
||||
private bool overlapsWithOtherBlock(WorldBase _world, int _clrIdx, Vector3i _blockPos, BlockValue _blockValue)
|
||||
{
|
||||
if (!this.isMultiBlock)
|
||||
{
|
||||
int type = _world.GetBlock(_clrIdx, _blockPos).type;
|
||||
return type != 0 && !Block.list[type].blockMaterial.IsGroundCover && !_world.IsWater(_blockPos);
|
||||
}
|
||||
byte rotation = _blockValue.rotation;
|
||||
for (int i = this.multiBlockPos.Length - 1; i >= 0; i--)
|
||||
{
|
||||
Vector3i pos = _blockPos + this.multiBlockPos.Get(i, _blockValue.type, (int)rotation);
|
||||
int type2 = _world.GetBlock(_clrIdx, pos).type;
|
||||
if (type2 != 0 && !Block.list[type2].blockMaterial.IsGroundCover && !_world.IsWater(pos))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void OnBlockAdded(WorldBase _world, Chunk _chunk, Vector3i _blockPos, BlockValue _blockValue)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded _blockValue.rotation: " + _blockValue.rotation);
|
||||
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded 1");
|
||||
base.OnBlockAdded(_world, _chunk, _blockPos, _blockValue);
|
||||
if (!SingletonMonoBehaviour<ConnectionManager>.Instance.IsServer) return;
|
||||
if (GameManager.Instance.IsEditMode()) return;
|
||||
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded 2");
|
||||
var entityId = -1;
|
||||
var text = RebirthUtilities.GetValueFromKey(_signText, "ec");
|
||||
if (string.IsNullOrEmpty(text))
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded 3");
|
||||
var group = RebirthUtilities.GetValueFromKey(_signText, "eg");
|
||||
if (string.IsNullOrEmpty(group))
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded 4");
|
||||
if (string.IsNullOrEmpty(_entityGroup))
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded 5");
|
||||
return;
|
||||
}
|
||||
group = _entityGroup;
|
||||
}
|
||||
var ClassID = 0;
|
||||
entityId = EntityGroups.GetRandomFromGroup(group, ref ClassID);
|
||||
if (entityId == 0) // Invalid group.
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded 6");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded 7");
|
||||
entityId = text.GetHashCode();
|
||||
}
|
||||
|
||||
// Match the rotation, and create the stub for the entity
|
||||
var entityCreationData = new EntityCreationData();
|
||||
entityCreationData.id = -1;
|
||||
entityCreationData.entityClass = entityId;
|
||||
entityCreationData.pos = _blockPos.ToVector3() + new Vector3(0.5f, 0.25f, 0.5f);
|
||||
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded entityCreationData.rot.Y: " + entityCreationData.rot.y);
|
||||
|
||||
// We need to check if this is a block entity or not, and match the rotation of the entity to the block, in case its a model preview.
|
||||
var rotation = new Vector3(0f, (float)(45f * (_blockValue.rotation & 3)), 0f);
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded flRotY: " + flRotY);
|
||||
|
||||
var blockEntity = _chunk.GetBlockEntity(_blockPos);
|
||||
if (blockEntity != null && blockEntity.bHasTransform)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded 8");
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded blockEntity != null");
|
||||
rotation = blockEntity.transform.rotation.eulerAngles;
|
||||
}
|
||||
|
||||
entityCreationData.rot = rotation;
|
||||
_chunk.AddEntityStub(entityCreationData);
|
||||
|
||||
//Log.Out("BlockSpawnEntityRebirth-OnBlockAdded entityCreationData.rot.Y 2: " + entityCreationData.rot.y);
|
||||
|
||||
// We'll use the Meta value as the spawn counter.
|
||||
_blockValue.meta = 0;
|
||||
GameManager.Instance.World.SetBlockRPC(_blockPos, _blockValue);
|
||||
|
||||
// Set up the tick delay to be pretty short, as we'll just destroy the block anyway.
|
||||
_world.GetWBT().AddScheduledBlockUpdate(0, _blockPos, blockID, (ulong)1UL);
|
||||
}
|
||||
|
||||
private void DestroySelf(Vector3i _blockPos, BlockValue _blockValue)
|
||||
{
|
||||
var keep = RebirthUtilities.GetValueFromKey(_signText, "keep");
|
||||
if (string.IsNullOrEmpty(keep))
|
||||
DamageBlock(GameManager.Instance.World, 0, _blockPos, _blockValue, Block.list[_blockValue.type].MaxDamage, -1, null, false);
|
||||
else
|
||||
GameManager.Instance.World.GetWBT().AddScheduledBlockUpdate(0, _blockPos, blockID, (ulong)10000UL);
|
||||
}
|
||||
|
||||
public void ApplySignData(EntityAlive entity, Vector3i _blockPos)
|
||||
{
|
||||
// Read the sign for expected values.
|
||||
var Task = RebirthUtilities.GetValueFromKey(_signText, "task");
|
||||
var Buff = RebirthUtilities.GetValueFromKey(_signText, "buff");
|
||||
var PathingCode = RebirthUtilities.GetValueFromKey(_signText, "pc");
|
||||
var setLeader = RebirthUtilities.GetValueFromKey(_signText, "leader");
|
||||
|
||||
if (Task.ToLower() == "stay")
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-ApplySignData SET TO STAY");
|
||||
entity.Buffs.SetCustomVar("CurrentOrder", (int)EntityUtilities.Orders.Stay);
|
||||
}
|
||||
if (Task.ToLower() == "wander")
|
||||
{
|
||||
entity.Buffs.AddBuff("buffOrderWander");
|
||||
}
|
||||
if (Task.ToLower() == "guard")
|
||||
{
|
||||
entity.Buffs.AddBuff("buffOrderGuard");
|
||||
}
|
||||
if (Task.ToLower() == "follow")
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-ApplySignData SET TO FOLLOW");
|
||||
entity.Buffs.SetCustomVar("CurrentOrder", (int)EntityUtilities.Orders.Follow);
|
||||
}
|
||||
|
||||
// Set up the pathing cube if available
|
||||
if (!string.IsNullOrEmpty(PathingCode))
|
||||
{
|
||||
if (StringParsers.TryParseFloat(PathingCode, out var pathingCode))
|
||||
entity.Buffs.SetCustomVar("PathingCode", pathingCode);
|
||||
}
|
||||
|
||||
// We are using the tile entity to transfer the owner ID from the client to the player.
|
||||
var tileEntity = GameManager.Instance.World.GetTileEntity(0, _blockPos) as TileEntityPoweredTrigger;
|
||||
if (tileEntity != null)
|
||||
{
|
||||
var persistentPlayerList = GameManager.Instance.GetPersistentPlayerList();
|
||||
var playerData = persistentPlayerList.GetPlayerData(tileEntity.GetOwner());
|
||||
if (playerData != null)
|
||||
OwnerID = playerData.EntityId;
|
||||
|
||||
// Set up ownership, but only after the entity is spawned.
|
||||
if (OwnerID > 0 && !string.IsNullOrEmpty(setLeader))
|
||||
{
|
||||
/*EntityUtilities.SetLeaderAndOwner(entity.entityId, (int)OwnerID, false);
|
||||
//npc.currentOrder = (int)EntityUtilities.Orders.Follow;
|
||||
|
||||
EntityPlayer player = entity.world.GetEntity(OwnerID) as EntityPlayer;
|
||||
|
||||
if (player != null)
|
||||
{
|
||||
float NPCMode = player.Buffs.GetCustomVar("varNPCModMode");
|
||||
|
||||
if (NPCMode == 0)
|
||||
{
|
||||
entity.Buffs.AddBuff("buffNPCModFullControlMode");
|
||||
}
|
||||
else
|
||||
{
|
||||
entity.Buffs.AddBuff("buffNPCModThreatControlMode");
|
||||
}
|
||||
}
|
||||
|
||||
RebirthManager.AddHire((int)OwnerID,
|
||||
entity.entityId,
|
||||
entity.EntityName,
|
||||
entity.EntityClass.entityClassName,
|
||||
entity.position,
|
||||
entity.rotation,
|
||||
new Vector3(0, 0, 0),
|
||||
new Vector3(0, 0, 0),
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
true
|
||||
);
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override bool UpdateTick(WorldBase _world, int _clrIdx, Vector3i _blockPos, BlockValue _blockValue, bool _bRandomTick, ulong _ticksIfLoaded, GameRandom _rnd)
|
||||
{
|
||||
Vector3 myVector = new Vector3(1, 2, 1);
|
||||
|
||||
if (SingletonMonoBehaviour<ConnectionManager>.Instance.IsServer)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 1");
|
||||
if (_blockValue.meta >= _maxSpawned)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 2");
|
||||
DestroySelf(_blockPos, _blockValue);
|
||||
return false;
|
||||
}
|
||||
var chunkCluster = _world.ChunkClusters[_clrIdx];
|
||||
if (chunkCluster == null)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 3");
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((Chunk)chunkCluster.GetChunkFromWorldPos(_blockPos) == null)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 4");
|
||||
return false;
|
||||
}
|
||||
|
||||
var entityId = -1;
|
||||
var text = RebirthUtilities.GetValueFromKey(_signText, "ec");
|
||||
if (string.IsNullOrEmpty(text))
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 5");
|
||||
var group = RebirthUtilities.GetValueFromKey(_signText, "eg");
|
||||
if (string.IsNullOrEmpty(group))
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 6");
|
||||
if (string.IsNullOrEmpty(_entityGroup))
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 7");
|
||||
DestroySelf(_blockPos, _blockValue);
|
||||
return false;
|
||||
}
|
||||
group = _entityGroup;
|
||||
}
|
||||
|
||||
var ClassID = 0;
|
||||
entityId = EntityGroups.GetRandomFromGroup(group, ref ClassID);
|
||||
if (entityId == 0) // Invalid group.
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 8");
|
||||
// Destroy the block after creating the entity.
|
||||
DestroySelf(_blockPos, _blockValue);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 9");
|
||||
entityId = text.GetHashCode();
|
||||
}
|
||||
|
||||
// Match the rotation of the block for the entity, so it faces in the same direction.
|
||||
var transformPos = _blockPos.ToVector3() + new Vector3(0.5f, 0.25f, 0.5f);
|
||||
if (_spawnRadius > 0)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 10");
|
||||
var areaSize = new Vector3(_spawnArea, _spawnArea, _spawnArea);
|
||||
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
if (!GameManager.Instance.World.FindRandomSpawnPointNearPosition(_blockPos, 15, out x, out y, out z, areaSize, true))
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 11");
|
||||
return true;
|
||||
}
|
||||
transformPos.x = x;
|
||||
transformPos.y = y;
|
||||
transformPos.z = z;
|
||||
}
|
||||
// We need to check if this is a block entity or not, and match the rotation of the entity to the block, in case its a model preview.
|
||||
var rotation = new Vector3(0f, (float)(45f * (_blockValue.rotation & 3)), 0f);
|
||||
var blockEntity = ((Chunk)_world.GetChunkFromWorldPos(_blockPos)).GetBlockEntity(_blockPos);
|
||||
if (blockEntity != null && blockEntity.bHasTransform)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 12");
|
||||
rotation = blockEntity.transform.rotation.eulerAngles;
|
||||
}
|
||||
|
||||
var entity = EntityFactory.CreateEntity(entityId, transformPos, rotation) as EntityAlive;
|
||||
if (entity == null)
|
||||
{
|
||||
//Log.Out($"No entity created: {_signText}");
|
||||
return false;
|
||||
}
|
||||
entity.SetSpawnerSource(EnumSpawnerSource.StaticSpawner);
|
||||
GameManager.Instance.World.SpawnEntityInWorld(entity);
|
||||
|
||||
if (entity is EntityAliveV2)
|
||||
{
|
||||
ApplySignData(entity as EntityAlive, _blockPos);
|
||||
}
|
||||
|
||||
/*var tileEntity = GameManager.Instance.World.GetTileEntity(0, _blockPos) as TileEntityPoweredTrigger;
|
||||
if (tileEntity != null)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 13");
|
||||
var persistentPlayerList = GameManager.Instance.GetPersistentPlayerList();
|
||||
var playerData = persistentPlayerList.GetPlayerData(tileEntity.GetOwner());
|
||||
if (playerData != null)
|
||||
{
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 14");
|
||||
//entity.Buffs.SetCustomVar("Owner", playerData.EntityId);
|
||||
//entity.Buffs.SetCustomVar("Leader", playerData.EntityId);
|
||||
//entity.Buffs.SetCustomVar("$FR_NPC_Stay", 1);
|
||||
}
|
||||
}*/
|
||||
|
||||
_blockValue.meta++;
|
||||
GameManager.Instance.World.SetBlockRPC(_blockPos, _blockValue);
|
||||
}
|
||||
|
||||
//Log.Out("BlockSpawnEntityRebirth-UpdateTick 15");
|
||||
DestroySelf(_blockPos, _blockValue);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user