private void HandleChemicalPayloadTrigger(EntityUid uid, ChemicalPayloadComponent component, TriggerEvent args) { if (component.BeakerSlotA.Item is not EntityUid beakerA || component.BeakerSlotB.Item is not EntityUid beakerB || !TryComp(beakerA, out FitsInDispenserComponent? compA) || !TryComp(beakerB, out FitsInDispenserComponent? compB) || !_solutionSystem.TryGetSolution(beakerA, compA.Solution, out var solutionA) || !_solutionSystem.TryGetSolution(beakerB, compB.Solution, out var solutionB) || solutionA.TotalVolume == 0 || solutionB.TotalVolume == 0) { return; } var solStringA = SolutionContainerSystem.ToPrettyString(solutionA); var solStringB = SolutionContainerSystem.ToPrettyString(solutionB); _logSystem.Add(LogType.ChemicalReaction, $"Chemical bomb payload {ToPrettyString(uid):payload} at {Transform(uid).MapPosition:location} is combining two solutions: {solStringA:solutionA} and {solStringB:solutionB}"); solutionA.MaxVolume += solutionB.MaxVolume; _solutionSystem.TryAddSolution(beakerA, solutionA, solutionB); solutionB.RemoveAllSolution(); // The grenade might be a dud. Redistribute solution: var tmpSol = _solutionSystem.SplitSolution(beakerA, solutionA, solutionA.CurrentVolume * solutionB.MaxVolume / solutionA.MaxVolume); _solutionSystem.TryAddSolution(beakerB, solutionB, tmpSol); solutionA.MaxVolume -= solutionB.MaxVolume; _solutionSystem.UpdateChemicals(beakerA, solutionA, false); }
private void OnComponentRemove(EntityUid uid, ChemicalPayloadComponent payload, ComponentRemove args) { _itemSlotsSystem.RemoveItemSlot(uid, payload.BeakerSlotA); _itemSlotsSystem.RemoveItemSlot(uid, payload.BeakerSlotB); }
private void OnComponentInit(EntityUid uid, ChemicalPayloadComponent payload, ComponentInit args) { _itemSlotsSystem.AddItemSlot(uid, "BeakerSlotA", payload.BeakerSlotA); _itemSlotsSystem.AddItemSlot(uid, "BeakerSlotB", payload.BeakerSlotB); }
private void OnContainerModified(EntityUid uid, ChemicalPayloadComponent component, ContainerModifiedMessage args) { UpdateAppearance(uid, component); }