diff --git a/src/k_objects.h b/src/k_objects.h index 45385b9a6..a14dd7dd1 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -95,7 +95,7 @@ void Obj_MonitorThink(mobj_t *monitor); void Obj_MonitorPartThink(mobj_t *part); fixed_t Obj_MonitorGetDamage(mobj_t *monitor, mobj_t *inflictor, UINT8 damagetype); void Obj_MonitorOnDamage(mobj_t *monitor, mobj_t *inflictor, INT32 damage); -void Obj_MonitorOnDeath(mobj_t *monitor); +void Obj_MonitorOnDeath(mobj_t *monitor, mobj_t *source); void Obj_MonitorShardThink(mobj_t *shard); UINT32 Obj_MonitorGetEmerald(const mobj_t *monitor); void Obj_MonitorSetItemSpot(mobj_t *monitor, mobj_t *spot); diff --git a/src/objects/monitor.c b/src/objects/monitor.c index 359210d8e..474a49795 100644 --- a/src/objects/monitor.c +++ b/src/objects/monitor.c @@ -670,7 +670,9 @@ Obj_MonitorOnDamage } void -Obj_MonitorOnDeath (mobj_t *monitor) +Obj_MonitorOnDeath +( mobj_t * monitor, + mobj_t * source) { const UINT8 itemcount = get_monitor_itemcount(monitor); const angle_t ang = ANGLE_MAX / itemcount; @@ -686,13 +688,21 @@ Obj_MonitorOnDeath (mobj_t *monitor) const SINT8 result = get_item_result(); const UINT32 localseed = restore_item_rng(sharedseed); - adjust_monitor_drop(monitor, + mobj_t *drop = adjust_monitor_drop(monitor, K_FlingPaperItem( monitor->x, monitor->y, monitor->z + (128 * mapobjectscale * flip), i * ang, flip, K_ItemResultToType(result), K_ItemResultToAmount(result))); + if (!P_MobjWasRemoved(source) && source->player) + { + P_SetTarget(&drop->tracer, source); + drop->extravalue1 = 6*TICRATE; + drop->colorized = true; + drop->color = source->player->skincolor; + } + // K_FlingPaperItem may advance RNG, so update our // copy of the seed afterward sharedseed = restore_item_rng(localseed); diff --git a/src/p_inter.c b/src/p_inter.c index a36f74262..6e4033fd8 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -396,6 +396,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_InstaThrust(player->mo, player->mo->angle, 20<extravalue1 > 0 && toucher != special->tracer) + { + player->pflags |= PF_CASTSHADOW; + return; + } + if (special->threshold >= FIRSTPOWERUP) { if (P_PlayerInPain(player)) @@ -2366,7 +2372,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget } case MT_MONITOR: - Obj_MonitorOnDeath(target); + Obj_MonitorOnDeath(target, source); break; case MT_BATTLEUFO: Obj_BattleUFODeath(target, inflictor); diff --git a/src/p_mobj.c b/src/p_mobj.c index 6622bbf79..dfe9008b8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7587,6 +7587,15 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } K_UpdateMobjItemOverlay(mobj, mobj->threshold, mobj->movecount); + + if (mobj->extravalue1 > 0) + { + mobj->extravalue1--; + if (mobj->extravalue1 < TICRATE) + { + mobj->colorized = mobj->extravalue1 & 1; + } + } break; } case MT_ITEMCAPSULE: