void APlayerCharacter::EnergyRemove()
{
	if (EnergyInt > 0.0001)
	{
		EnergyInt -= EnergyDamageSpeed;
		UpdateEnergy(EnergyInt);
	}
}
void APlayerCharacter::EnergyAdd()
{
	if (EnergyInt < 0.5)
	{
		EnergyInt += EnergyRegenerateSpeed;
		UpdateEnergy(EnergyInt);
	}
}
Example #3
0
bool ProcessDot11Frame(UCHAR *frameBuf, ULONG frameBufSize )
{
    
    PDOT11RFC1042ENCAP pWlanHeader = (PDOT11RFC1042ENCAP)frameBuf;
        
    if (pWlanHeader->MacHeader.FrameControl.Type    == FRAME_DATA && 
        pWlanHeader->MacHeader.FrameControl.Subtype == SUBT_DATA ) 
    {

        static USHORT CurRecvSeqNo = 0xffff;

        int fTargetFrame = 0;
        
        // Try to send some ACK
        if ( (memcmp( MACAddress.Address, 
                     pWlanHeader->MacHeader.Address1.Address, 
                     MAC_ADDRESS_LENGTH) == 0) )
        {
            DataFrameAck11(pWlanHeader, frameBufSize);
            UpdateLastRate();
            PlotText ( "mac event", "receive a packet - seq (%d) size (%d) rate (%u).................................",
                pWlanHeader->MacHeader.SequenceControl.SequenceNumber,
                frameBufSize,
                lastRate
            );

            fTargetFrame = 1;
        }
        
        if ( fTargetFrame ||
             ETH_IS_BROADCAST (pWlanHeader->MacHeader.Address1.Address) )
        {
            UpdateLastRate();
            nDataPacketRcvCnt ++;
            
            if (CurRecvSeqNo  != pWlanHeader->MacHeader.SequenceControl.SequenceNumber 
                && pWlanHeader->MacHeader.SequenceControl.FragmentNumber == 0 ) {			
                if ( frameBufSize < sizeof(DOT11RFC1042ENCAP)) {
                    return S_OK;
                }
                
                CurRecvSeqNo   = pWlanHeader->MacHeader.SequenceControl.SequenceNumber;
                MAC_ADDRESS			destAddr;
                MAC_ADDRESS			srcAddr;
                UINT16				Type;
                ULONG				Offset;
                PETHERNET_HEADER	pEthernetHeader;

                /* ad hoc mode
                destAddr = pWlanHeader->MacHeader.Address1;
                srcAddr  = pWlanHeader->MacHeader.Address2;


                lastMACDst   = pWlanHeader->MacHeader.Address1;
                lastMACSrc   = pWlanHeader->MacHeader.Address2;
                lastMACBssid = pWlanHeader->MacHeader.Address3;
                */

                /* AP mode */
                if ( OpMode == CLIENT_MODE ) {
                    destAddr = pWlanHeader->MacHeader.Address1;
                    srcAddr  = pWlanHeader->MacHeader.Address3;
                    Type     = pWlanHeader->Type;

                    lastMACDst   = pWlanHeader->MacHeader.Address1;
                    lastMACSrc   = pWlanHeader->MacHeader.Address3;
                    lastMACBssid = pWlanHeader->MacHeader.Address2;
                } else {
                    destAddr = pWlanHeader->MacHeader.Address1;
                    srcAddr  = pWlanHeader->MacHeader.Address2;
                    Type     = pWlanHeader->Type;					
                    
                    lastMACDst	 = pWlanHeader->MacHeader.Address1;
                    lastMACSrc	 = pWlanHeader->MacHeader.Address2;
                    lastMACBssid = pWlanHeader->MacHeader.Address3;
                }

                Offset   = sizeof(DOT11RFC1042ENCAP) - sizeof(ETHERNET_HEADER);
                pEthernetHeader = (PETHERNET_HEADER)(frameBuf + Offset);
                pEthernetHeader->destAddr = destAddr;
                pEthernetHeader->srcAddr = srcAddr;
                pEthernetHeader->Type = Type;

                PlotText ( "mac event", "Indicate packet seq (%d)", 
                    CurRecvSeqNo );

                HRESULT hr;
                hr = SoraUIndicateRxPacket(frameBuf + Offset, frameBufSize - Offset - 4 ); // remove FCS

                UpdateEnergy ();
                return SUCCEEDED(hr);
            }
        }
        else {
            nInterferenceCnt ++;
        }
    }
    else
    if (pWlanHeader->MacHeader.FrameControl.Type == FRAME_CTRL &&
        pWlanHeader->MacHeader.FrameControl.Subtype == SUBT_ACK) {
        
        if (LastPACKETxID) {
            if (memcmp(MACAddress.Address, 
                pWlanHeader->MacHeader.Address1.Address,
                MAC_ADDRESS_LENGTH))
                return true;

            struct PACKETxID* ptid;
            ptid = LastPACKETxID;
            LastPACKETxID = NULL;

            nAckRcvCnt ++;
            
            if ( ptid->m_packet ) {
                SoraUCompleteTxPacket(ptid->m_packet, 
                    STATUS_SUCCESS);
            }
            
            debug_printf("Complete Send Packet: [%08x], TxID: [%d], TX succeed\n", 
                ptid->m_packet, 
                ptid->m_tid.m_txid[0]);
            
            switch(ptid->m_status) {
            case PACKET_CAN_TX:
                FreeTxResource(&ptid->m_tid);
                break;
            default:
                break;
            }
            free(ptid);
        }
    }
    else
    if (pWlanHeader->MacHeader.FrameControl.Type    == FRAME_MAN &&
        pWlanHeader->MacHeader.FrameControl.Subtype == SUBT_BEACON)
    {
        ProcessBeacon ((PDOT11_MAC_BEACON)pWlanHeader);
    }
    else 
    if (pWlanHeader->MacHeader.FrameControl.Type    == FRAME_MAN )
    {
        if ( memcmp( MACAddress.Address, pWlanHeader->MacHeader.Address1.Address, MAC_ADDRESS_LENGTH) == 0 )
        {
            if ( pWlanHeader->MacHeader.FrameControl.Subtype == SUBT_AUTH ) // auth
            {
                DataFrameAck11 ( pWlanHeader, frameBufSize );

                if ( assoState == ASSO_NONE ) {
                    assoState = ASSO_AUTH;
                }
            } else if ( pWlanHeader->MacHeader.FrameControl.Subtype == SUBT_ASSO ) // asso
            {
                DataFrameAck11 ( pWlanHeader, frameBufSize );

                if ( assoState == ASSO_AUTH || 
                     assoState == ASSO_NONE 
                ) {
                    assoState = ASSO_DONE;
                }
            } else if ( pWlanHeader->MacHeader.FrameControl.Subtype == SUBT_DEASSO || // deassociate
                        pWlanHeader->MacHeader.FrameControl.Subtype == SUBT_DEAUTH )  // deauth
            {
                assoState = ASSO_NONE;  
            }
        }	
    }

    return true;
}