Урны ремонтника и лутера: большая зона, запуск кнопкой, кнопки-состояния
- necroCinerariumRepair/+Skull и necroCinerariumLoot/+Skull (пока на модели урны сборщика), рецепты (урна + ремкомплект / отмычка, на крови и на соке), открываются с урнами. - Зона - сторона притязания сервера или 31/21/11 (пункт «Размер зоны»), весь столб мира, каркас по «Показать границы»; работа - по «Запустить», один проход, «Остановить». - Ремонтник: обход столбов из общего бюджета клеток, очередь повреждённых блоков с RepairItems (зоны пересекаются - блок берёт первый), ремонт раз в 2.5 с материалами из ящиков по нитям (доля по повреждению), не хватает - ждёт с мигающей кнопкой. - Лутер: предметы на земле, мешки с зомби, красные трупы (тем же путём, что игрок, с находкой черепа) - в ящик с любой нитью; рюкзаки игроков и аэродроп не трогает. - Кнопки на модели (рендереры «button»): жёлтая - ждёт, мигает - нехватка/ящик полон, зелёная - работа, красная - прилив. Запись урны v6 (зона, проход, курсор, кто нажал). - Тексты 13 языков; команды разработки necrodamage, necrodrop, necrobag, necrocorpse, necrourn run|stop|size. Проверено в игре: ремонтник (нехватка -> материалы -> починил 2 блока), лутер (предметы с земли). Мешки и красные трупы - не проверены. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
85d8036e81
commit
a352a408a4
@@ -46,6 +46,43 @@ namespace NecromancerTome
|
||||
case "necrohold": Hold(pl, _params); break;
|
||||
case "necrobox": Box(w, _params); break;
|
||||
case "necrourn": Urn(w, _params); break;
|
||||
case "necrodamage":
|
||||
{
|
||||
// necrodamage x y z урон - повредить блок (проверка ремонтника)
|
||||
Vector3i dp = P(_params, 0);
|
||||
BlockValue dbv = w.GetBlock(dp);
|
||||
dbv.damage = Mathf.Min(dbv.Block.MaxDamage - 1, dbv.damage + int.Parse(_params[3]));
|
||||
w.SetBlockRPC(dp, dbv);
|
||||
Out("necrodamage: " + dbv.Block.GetBlockName() + " в " + dp + " повреждение " + dbv.damage + "/" + dbv.Block.MaxDamage);
|
||||
break;
|
||||
}
|
||||
case "necrodrop":
|
||||
{
|
||||
// necrodrop предмет число x y z - бросить на землю (проверка лутера)
|
||||
ItemValue div = ItemClass.GetItem(_params[0], true);
|
||||
GameManager.Instance.ItemDropServer(new ItemStack(div, int.Parse(_params[1])), P(_params, 2).ToVector3() + new Vector3(0.5f, 0.5f, 0.5f), Vector3.zero);
|
||||
Out("necrodrop: " + _params[0] + " x" + _params[1]);
|
||||
break;
|
||||
}
|
||||
case "necrobag":
|
||||
{
|
||||
// necrobag x y z - мешок с зомби (EntityLootContainer со списком cntDropBag), нетронутый
|
||||
Entity bag = EntityFactory.CreateEntity(EntityClass.FromString("DroppedLootContainer"), P(_params, 0).ToVector3() + new Vector3(0.5f, 0.3f, 0.5f));
|
||||
bag.lootList = "cntDropBag";
|
||||
w.SpawnEntityInWorld(bag);
|
||||
Out("necrobag: " + bag.entityId);
|
||||
break;
|
||||
}
|
||||
case "necrocorpse":
|
||||
{
|
||||
// necrocorpse x y z [класс] - зомби, убитый и помеченный красным трупом (как VictimPatch)
|
||||
string cls = _params.Count > 3 ? _params[3] : "zombieArlene";
|
||||
EntityAlive z = EntityFactory.CreateEntity(EntityClass.FromString(cls), P(_params, 0).ToVector3() + new Vector3(0.5f, 0.1f, 0.5f)) as EntityAlive;
|
||||
w.SpawnEntityInWorld(z);
|
||||
ThreadManager.StartCoroutine(KillAndMark(z));
|
||||
Out("necrocorpse: " + z.entityId + " " + cls);
|
||||
break;
|
||||
}
|
||||
case "necrogod": God(pl, _params.Count == 0 || _params[0] != "off"); break;
|
||||
case "necroclick":
|
||||
// necroclick 0|1 [x y z] - по блоку под прицелом или по указанной клетке (луч не всегда попадает в низкий череп).
|
||||
@@ -99,6 +136,18 @@ namespace NecromancerTome
|
||||
Out("necrogod: " + (_on ? "бог, ИИ не видит" : "обычный"));
|
||||
}
|
||||
|
||||
static System.Collections.IEnumerator KillAndMark(EntityAlive _z)
|
||||
{
|
||||
yield return new WaitForSeconds(1f);
|
||||
_z.DamageEntity(new DamageSource(EnumDamageSource.Internal, EnumDamageTypes.Suicide), 99999, false);
|
||||
yield return new WaitForSeconds(1f);
|
||||
if (_z.IsDead())
|
||||
{
|
||||
CorpseLoot.MarkCorpse(_z);
|
||||
}
|
||||
UnityEngine.Debug.Log("[NecromancerTome] mailbox: necrocorpse: " + _z.entityId + (_z.IsDead() ? " убит и помечен" : " НЕ умер"));
|
||||
}
|
||||
|
||||
static void Aim(World _w, EntityPlayerLocal _pl)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder("necroaim: игрок ").Append(_pl.position.ToString("F1")).Append(", взгляд ").Append(_pl.rotation.ToString("F0"));
|
||||
@@ -247,6 +296,9 @@ namespace NecromancerTome
|
||||
case "sample":
|
||||
u.SetSample(_p.Count > 5 ? new ItemStack(ItemClass.GetItem(_p[4], true), int.Parse(_p[5])) : ItemStack.Empty.Clone());
|
||||
break;
|
||||
case "run": u.ZoneCommand("zurn_run", GameManager.Instance.World.GetPrimaryPlayer()); break;
|
||||
case "stop": u.ZoneCommand("zurn_stop", null); break;
|
||||
case "size": u.ZoneSide = int.Parse(_p[4]); u.SetModified(); break;
|
||||
case "group":
|
||||
u.GroupMask = _p[4] == "нет" || _p[4] == "none" ? 0u : CinerariumGroups.All;
|
||||
u.SetModified();
|
||||
@@ -262,7 +314,7 @@ namespace NecromancerTome
|
||||
}
|
||||
Out("necrourn: " + pos + " " + _w.GetBlock(pos).Block?.GetBlockName() + ", череп " + u.HasSkull + ", застрял " + u.Stuck + ", мигание " + blink +
|
||||
", откуда " + u.ThreadFrom.Count + ", куда " + (u.HasThreadTo ? u.ThreadTo.ToString() : "нет") + ", от урны " + u.ThreadOut.Count +
|
||||
", образец " + (u.Sample == null || u.Sample.IsEmpty() ? "нет" : u.Sample.itemValue.ItemClass?.GetItemName() + "x" + u.Sample.count));
|
||||
", зона " + (u.IsBigZone ? u.ZoneSideNow + (u.ZoneRunning ? " идёт" : " ждёт") + (u.ZoneLacking ? " нехватка" : "") + " курсор " + u.ZoneCursor : "-") + ", образец " + (u.Sample == null || u.Sample.IsEmpty() ? "нет" : u.Sample.itemValue.ItemClass?.GetItemName() + "x" + u.Sample.count));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,4 +389,40 @@ namespace NecromancerTome
|
||||
public override bool AllowedInMainMenu => false;
|
||||
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrogod", _params);
|
||||
}
|
||||
|
||||
[Preserve]
|
||||
public class ConsoleCmdNecroDamage : ConsoleCmdAbstract
|
||||
{
|
||||
public override string[] getCommands() => new[] { "necrodamage" };
|
||||
public override string getDescription() => "NecromancerTome (разработка): повредить блок x y z урон";
|
||||
public override bool AllowedInMainMenu => false;
|
||||
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrodamage", _params);
|
||||
}
|
||||
|
||||
[Preserve]
|
||||
public class ConsoleCmdNecroDrop : ConsoleCmdAbstract
|
||||
{
|
||||
public override string[] getCommands() => new[] { "necrodrop" };
|
||||
public override string getDescription() => "NecromancerTome (разработка): бросить предмет: имя число x y z";
|
||||
public override bool AllowedInMainMenu => false;
|
||||
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrodrop", _params);
|
||||
}
|
||||
|
||||
[Preserve]
|
||||
public class ConsoleCmdNecroBag : ConsoleCmdAbstract
|
||||
{
|
||||
public override string[] getCommands() => new[] { "necrobag" };
|
||||
public override string getDescription() => "NecromancerTome (разработка): мешок с зомби x y z";
|
||||
public override bool AllowedInMainMenu => false;
|
||||
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrobag", _params);
|
||||
}
|
||||
|
||||
[Preserve]
|
||||
public class ConsoleCmdNecroCorpse : ConsoleCmdAbstract
|
||||
{
|
||||
public override string[] getCommands() => new[] { "necrocorpse" };
|
||||
public override string getDescription() => "NecromancerTome (разработка): красный труп x y z [класс]";
|
||||
public override bool AllowedInMainMenu => false;
|
||||
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrocorpse", _params);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user