Example #1
0
    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);
    }
Example #2
0
 private void OnComponentRemove(EntityUid uid, ChemicalPayloadComponent payload, ComponentRemove args)
 {
     _itemSlotsSystem.RemoveItemSlot(uid, payload.BeakerSlotA);
     _itemSlotsSystem.RemoveItemSlot(uid, payload.BeakerSlotB);
 }
Example #3
0
 private void OnComponentInit(EntityUid uid, ChemicalPayloadComponent payload, ComponentInit args)
 {
     _itemSlotsSystem.AddItemSlot(uid, "BeakerSlotA", payload.BeakerSlotA);
     _itemSlotsSystem.AddItemSlot(uid, "BeakerSlotB", payload.BeakerSlotB);
 }
Example #4
0
 private void OnContainerModified(EntityUid uid, ChemicalPayloadComponent component, ContainerModifiedMessage args)
 {
     UpdateAppearance(uid, component);
 }